24. 两两交换链表中的节点 :两两交换链表中的节点
思路:
1.需要两两交换节点,那么每次跳转就需要跳转两个单位来完成
2.交换节点就是实现指针指向的改变.要做好每个节点指针的维护,不能在更改指针指向时丢失
eg: 1->2->3->4 变成 2->1->4->3 需要断开1 2;2 3 这时就要维护好1 3 的指针,防止丢失.
ListNode* virtualHead = new ListNode(0);
virtualHead->next = head;
ListNode* cur = virtualHead;
while(cur->next != nullptr && cur->next->next != nullptr) {
// 1 2 3 4
ListNode* temp = cur->next; // 1
ListNode* temp1 = cur->next->next->next; //3
cur->next = cur->next->next; // 由指向1改为指向2
cur->next->next = temp; //2的下一项指向保存的1
cur->next->next->next = temp1;//1的下一项指向保存的3
cur = cur->next->next; //
}
return virtualHead->next;
19.删除链表的倒数第N个节点 :删除链表的倒数第n个节点
思考:
1.暴力解法:通过遍历得到总数,然后再走一次;
2.使用两个指针,他们两个的差距就是n.------>快慢数组; 怎样实现它们之间的差距,让快的先走,然后再一同前进,直到走到最后.
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* fast = dummy;
ListNode* slow = dummy;
while(n--) {
fast = fast->next;
}
while(fast->next != nullptr) {
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
return dummy->next;
02.07. 链表相交 :数组相交
思路:
1.一旦相较,那么之后的节点地址就一定是相等的.----->只能通过完全遍历来实现
2.怎样两个数组的长度差距来寻找最近的相交节点; 将尾部对齐,然后让两者对齐后寻找相交节点.
ListNode* curA = headA;
ListNode* curB = headB;
int lenA = 0;
int lenB = 0;
while(curA != NULL) {
curA = curA->next;
lenA++;
}
while(curB != NULL) {
curB = curB->next;
lenB++;
}
curA = headA;
curB = headB;
if(lenB > lenA) {
swap (lenA, lenB);
swap (curA, curB);
}
int gap = lenA-lenB;
while(gap--) {
curA = curA->next;
}
while(curA != NULL) {
if(curA == curB) {
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
ps:关于是选择curA 还是 curA->next 进行判断,应该是看其初始指向是dummy还是head.
142.环形链表II :环形链表
思考:怎样判断是否有环?怎样判断哪里是环的入口? 第一想法是双指针
让其保持速度的差距,一次移动一个;另一个移动两个;那么相遇时,快指针绝对比慢指针多了n圈.
但是在具体数据时,还是没想清楚,需要跟着随想录推一下.
只记下最终结论:从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。
ListNode* fast = head;
ListNode* slow = head;
while(fast != NULL && fast->next != NULL) {
fast = fast->next->next;
slow = slow->next;
if(fast == slow) {
ListNode* index1 = fast;
ListNode* index2 = head;
while(index1 != index2) {
index1 = index1->next;
index2 = index2->next;
}
return index2;
}
}
return NULL;