24. 两两交换链表中的节点
用虚拟头结点,这样会方便很多。
本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。
一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序
交换的步骤
while(cur->next!=nullptr&&cur->next->next!=nullptr)\\条件是&&{
ListNode* temp=cur->next;
ListNode* temp1=cur->next->next->next;
cur->next=cur->next->next;
cur->next->next=temp;
cur->next->next->next=temp1;
cur=cur->next->next;\\指针要往后移两位
160.链表相交
大家注意数值相同,不代表指针相同。
// 让curA为最长链表的头,lenA为其长度
// swap:交换值/内容
if (lenB > lenA) {
swap (lenA, lenB);
swap (curA, curB);
}
// 遍历curA 和 curB,遇到相同则直接返回
while (curA != NULL) {
if (curA == curB)//判断是否相同
{
return curA;
}
curA = curA->next;
curB = curB->next;
}
19.删除链表的倒数第N个节点
双指针的操作,要注意,删除第N个节点,那么我们当前遍历的指针一定要指向 第N个节点的前一个节点,建议先看视频。
删除的步骤
while(n-- && fast != NULL) {
fast = fast->next;
}
fast = fast->next; // fast再提前走一步,因为需要让slow指向删除节点的上一个节点
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next; //删除节点
142环形链表II(需重写代码)
算是链表比较有难度的题目,需要多花点时间理解 确定环和找环入口,建议先看视频。
数学公式的推导和理解:
x = (n - 1) (y + z) + z:从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点
为什么第一次在环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y 呢?:在slow开始走的那一环已经和fast相遇了;fast相对于slow是一次移动一个节点,所以不可能跳过去
函数编写后记得编写返回值
while(fast!=nullptr&&fast->next!=nullptr){
fast=fast->next->next;
slow=slow->next;
if(fast==slow){
ListNode* index1=fast;
ListNode* index2=head;
while(index1!=index2)//此while要做if的循环里面
{
index1=index1->next;
index2=index2->next;
}
return index2;
}
}