http://【帮你把链表操作学个通透!LeetCode:707.设计链表-哔哩哔哩】 https://b23.tv/FB07jhU
链表中,为什么要用一个临时指针cur进行操作而不是直接用head,因为我们操作完链表后是需要返回头结点的,如果你用head的话,那可能头结点的值都改了,我们如何返回头结点,所以是用临时指针进行操作。
1.获取第n个节点的值
cur=dummy head->next;
while(n--){
cur=cur->next;
}
return cur->val;
这里要注意的是cur是=dummy head ->next。
以及while的括号里n的问题。n有时候加1有时候减1,有时候不加不减,要考虑到边界条件。
举个例子,比如链表1-2-3-4,获取第2个节点的值,因为下标是从0开始,所以是获取节点3,刚开始设cur指向1,while循环条件是n大于0。第一轮,n=2,cur指向下一个即2,然后n--=1;然后第二轮,n=1,cur指向下一个即3,然后n--=0;第三轮,n等于0了,所以不进入循环了,最后返回cur->val。
其实这个可以直接考虑极端情况,链表只有一个节点即头结点,然后我们要获取这个头结点即第0个节点。cur指向这个头结点,然后n是0,所以不进入循环,所以返回cur->val即头结点的值。
2.头部插入节点
newnode=new node();
newnode->next=dummy head->next;
dummy head->next=newnode;
size++;
插入节点问题,很多人都会犯顺序的错误,比如先dummy->next=new node ,再new node->next=dummy next。注意你一开始dummy next改为指向new node了,所以dummy next指向head的指针指向已经没有了,然后你后来又要new node->next=dummy next就不对的。所以应该是先new node->next=dummy next,再dummy->next=new node
3.尾部插入节点
newnode=new node();
cur=dummy head;
while(cur->next!=null){
cur=cur->next;
}
cur->next=newnode;
newnode->next=null;
size++;
这里注意一下怎么找最后一个节点就可以了。
4.第n个节点前插入节点
newnode=new node();
cur=dummyhead;
while(n--){
cur=cur->next;
}
newnode->next=cur->next;
cur->next=newnode;
size++;
注意cur是指向第n-1个节点,cur->next才指向第n个节点,这样你才知道第n个节点前的一个节点是谁嘛。
然后怎么找到这第n个节点,while循环,这里又要注意括号里的n,直接考虑极端情况,如果是在头结点前插入,那cur应该等于dummyhead,而不是dummyhead->next,并且是n开始循环不是n+1或者n-1开始循环,比如是头结点前插入,那cur指向虚拟结点,因为n=0,所以不进入循环,所以就能正好让cur指向虚拟结点,cur->next指向头结点。
5.删除第n个节点
cur=dummy head;
while(n--){
cur=cur->next;
}
cur-next=cur->next->next;
size--;
具体代码可去代码随想录网站看