先定义一个结构体,里面包含了数据和指向下一个结点的地址(链表就是通过地址来使各个结点串在一条线上的)
struct Node
{
int data;
Node* pNext = nullptr;
};
链表的增加数据
void insertNode(Node*& pHead, int index,int data)
{
//链表长度
int size = 0;
//创建一个新结点
Node* newNode = new Node();
Node* p = pHead;
newNode->data = data;
//计算链表长度
while (p)
{
p = p->pNext;
size++;
}
p = pHead;
//index=0时 在头结点插入
if (0 == index)
{
newNode->pNext = pHead;
pHead = newNode;
return;
}
//判断是否在尾结点插入
if (size == index)
{
while (p->pNext)
{
p = p->pNext;
}
p->pNext = newNode;
newNode->pNext = nullptr;
return;
}
//除了头、尾结点 任意中间位置插入
for (int i = 0;i < index - 1;i++)
{
p = p->pNext;
if (!p->pNext)
{
return;
}
}
newNode->pNext = p->pNext;
p->pNext = newNode;
}
链表的增加分为三种情况:在头结点增加、在尾结点增加、在中间任意位置增加
一、在头节点插入一个数据
只需要将新的结点指向原先的头结点就可以了。
二、在中间插入一个数据
我们需要找到插入位置的前一个结点,将新的结点指向这个前一个节点的下一个结点,然后在把前一个结点指向现在这个新的结点。
如果我们先把前一个结点连接新的结点的话,我们会找不到前一个结点指向的下一个结点。
三、在尾节点插入一个数据
我们直接判断插入的位置和链表的长度关系,就知道是否在尾结点插入,如果是则只需要将原先的尾结点指向现在新的节点即可。
链表的删除结点操作
void removeNode(Node*& pHead, int index)
{
//删除头结点
if (0 == index)
{
Node* p = pHead;
pHead = pHead->pNext;
delete p;
p = nullptr;
return;
}
Node* p = pHead;
Node* t = nullptr;
//删除任意结点
for (int i = 0;i < index - 1;i++)
{
p = p->pNext;
if (!p->pNext)
{
return;
}
}
t = p->pNext;
p->pNext = p->pNext->pNext;
delete t;
t = nullptr;
}
删除结点只分为两种情况:删除头结点及任意结点
一、删除头结点
只需要判断要删除的位置是否为0,如果是则只需要将头结点指向头结点的下一个结点,原先的结点删除释放内存。
二、删除任意结点
剩下的情况就是删除任意结点,因为要删除结点的时候,我们要找到要删除结点的前一个结点,将前一个节点指向要删除结点的下一个结点,所以即使是删除最后一个结点,我们也能找到倒数第二个结点,将倒数第二个结点指向最后一个结点的指向(也就是nullptr空指针)。
链表中获取某个节点
Node getNode(Node*& pHead, int index)
{
Node* p = pHead;
for (int i = 0;i < index;i++)
{
if (!p->pNext)
{
cout << "超出范围" << endl;
return* p;
}
p = p->pNext;
}
return* p;
}
只需要一个for循环,循环n-1次就可以得到第n个结点
链表中改变数据
要改变某个结点的数据,首先得获取这个节点,所以调用getNode()函数 就可以修改这个结点的数据
翻转链表
void reverseList(Node*& pHead)
{
Node* newList = nullptr;
Node* currentNode = pHead;
Node* oldList = pHead;
while (oldList)
{
oldList = oldList->pNext;
currentNode->pNext = newList;
newList = currentNode;
currentNode = oldList;
}
pHead = newList;
}
首先,我们得有一个新的节点指向空
然后,我们再用两个新节点指向头结点
例如:我们有1 2 3 个结点
old、current指向了(->)1
new 现在是空指针
oldList = oldList->pNext;// old移动到下一个结点(作用是为了能找到剩下的结点)
old -> 2
current -> 1
new -> null
currentNode->pNext = newList; //将现在的结点指向新结点的头结点old -> 2
current -> 1-> nullptr 1现在既是头结点也是尾结点
new -> null
newList = currentNode;//将新的节点指向当前的结点
old -> 2
current -> 1
new -> 1
currentNode = oldList;//经过上面的步骤curren已经完成了指向任务,它指向剩下结点的头结点
old -> 2
current -> 2
new -> 1
然后只要循环这四个步骤就行