单链表插入操作常考虑三种情况:首部,中间,尾部
1.在链表表头插入
①要创建一个新结点newNode
②让新结点的指针指向头结点,即newNode->next=head;
③接着head不要给扔掉了,要记得回到首部的位置,即head=newNode;
2.在链表中间插入
①同样先创建个新结点newNode
②然后要确定插入的位置,找到需要插入的结点的前驱结点,可以通过判断前驱结点的后继结点是否为要插入的值来找到要插入的位置。如下图cur->next=node(7)时候表示找到插入位置,此时cur->val=15。
③改变指针指向。先让新节点指向要插入的结点,newNode->next=node(15)->next,再让新节点与前驱结点连接,node(15)->next=newNode。
注意先后指针指向顺序不能颠倒,因为链表中能够一个结点只有一个后继结点,如果先node(15)->next=newNode,就不能找到要插入的结点,也就不能连接上该结点了
3.在链表尾部插入
同理,找到尾部元素后,将尾部结点指向新节点,要记得新节点指向null,newNode->next=NULL
综上,单链表插入插入的方法如下
//链表插入
struct ListNode* insertNode(struct ListNode* head,struct ListNode* nodeInsert,int pos)
{
//待插入的结点是链表的头结点
if(head==NULL)
{
return nodeInsert;
}
//获取链表长度
int size=getLength(head);
//插入位置不合理
if(pos>size+1||pos<1)
{
cout<<"位置参数越界"<<endl;
return head;
}
//插入节点到头部
if(pos==1)
{
nodeInsert->next=head;
head=nodeInsert;
return head;
}
struct ListNode* node=head;
int count=1;
//找到要插入的位置的前驱结点
while(count<pos-1)
{
node=node->next;
count++;
}
//注意顺序不要搞反
nodeInsert->next=node->next;
node->next=nodeInsert;
return head;
}