1. ListNode 线性链表
1.1 类定义
class oprateList
{
public:
/*创建链表*/
void createList(ListNode*, int);
/*输出链表*/
void outputList(ListNode *);
/*链表长度*/
int lengthOfList(ListNode *);
/*链表元素取值*/
int getValue(LinkList *);
/*定位插入元素*/
void insertList(ListNode*,int,int)
/*删除定位元素*/
void deleteE(ListNode*,int)
/*删除链表元素*/
void deleteList(ListNode *);
}
1.2 结构体
//定义表结点的数据结构:数据+指针
struct ListNode{
int val;
ListNode * next;
}
1.3 创建链表
void operateList::createList(ListNode * head,int n)
{
int i = 0;
//避免破坏头指针
ListNode * phead = head;
//插入 n-1 个元素
for(i = 1;i < n;i++)
{
//动态创建新的链表节点并初始化
ListNode * node = new ListNode;
node->val = i;
node->next = NULL;
//辅助指针先是把新创建的节点接到链表的结尾
phead->next = node;
//辅助指针后移指向最新的节点
phead = node;
//delete node; 此处不能释放,phead = node,是链表的最后一个节点
}
//head = head->next; 头指针指向第一个元素
}
1.4 输出链表
void operateList::outputList(ListNode * linkList)
{
if(linkList == NULL || linkList->next == NULL)
{
//链表为空
return;
}
else
{
LinkNode* p = linkList;
while(p->next != NULL)
{
p = p->next;
cout << p->value << " ";
}
}
}
1.5 链表长度
int operateList::lengthOfList(ListNode * linkList,int n)
{
if(linkList == NULL || linkList->next == NULL)
{
//链表为空
return 0;
}
else
{
int count = 0;
LinkNode* p = linkList;
while(p->next != NULL)
{
p = p->next;
count ++;
}
return count;
}
}
1.6 链表元素取值
int operateList::getValue(ListNode * linkList,int index)
{
if(index <= lengthOfList(linkList))
{
LinkList *p = linkList;
//定位到索引节点
for(int i = 0;i < index;i ++)
{
p = p->next;
}
return p->value;
}
else
{
//索引越界
return -1;
}
}
1.7 定位插入元素
void operateList::insertList(ListNode* linkList,int site,int e)
{
if(site <= lengthOfList(linkList))
{
LinkList *p = linkList;
//定位到索引节点
for(int i = 0;i < site;i ++)
{
p = p->next;
}
ListNode* pTemp = new ListNode;
pTemp->value = e;
//辅助指针连接链表后的所有节点
pTemp->next = p->next;
//链表连接辅助指针
p->next = pTemp;
cout << "插入元素成功";
}
else
{
//索引越界
cout << "索引越界";
return;
}
}
1.8 删除定位节点
void operateList::deleteE(ListNode * linkList,int site)
{
if(site <= lengthOfList(linkList))
{
LinkList *p = linkList;
//定位到索引节点
for(int i = 0;i < index;i ++)
{
p = p->next;
}
ListNode* pTemp = new ListNode;
pTemp = p->next;
p->next = pTemp->next;
delete pTemp;
cout << "删除元素成功";
}
else
{
//索引越界
return -1;
}
}
1.9 删除链表元素
void operateList::deleteList(ListNode * linkList)
{
//头节点
ListNode* p = linkList->next;
while(p != NULL)
{
ListNode* pTemp = p;
p = p->next;
//删除下一节点
delete pTemp;
}
//头节点指向空元素
linkList->next = NULL;
cout << "删除链表成功";
}