LeetCode24.两两交换链表中的结点
思路
构建一个虚拟头结点dummyHead,让cur = dummyHead,然后再考虑链表中的结点个数是奇数个还是偶数个,其循环条件有所不同。奇数:前面偶数个结点两两交换,最后一个不交换,此时循环条件是cur->next->next != NULL;偶数:cur->next != NULL。此时交换的就是cur指向的后面两个结点
注意:在交换过程时,要事先保存两个临时变量,分别时temp1 = cur->next 和temp2 = cur->next->next->next;避免修改cur->next时找不到结点位置。
代码:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur = dummyHead;
//判断偶数个结点和奇数个结点退出循环的情况
//1.奇数:前面偶数个结点两两交换,最后一个不交换,此时cur->next->next == NULL
//2.偶数:cur->next == NULL
while(cur->next != nullptr && cur->next->next != nullptr){
ListNode* temp1 = cur->next;
ListNode* temp2 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = temp1;//temp1->next->next = temp1;
cur->next->next->next = temp2;// temp1->next = temp2;
cur = cur->next->next;
}
return dummyHead->next;
}
};
LeetCode19.删除链表的倒数第N个结点
思路:
先要找到倒数第N个结点的前一个结点,首先构建一个虚拟头结点,再定义两个指针 一个fast,一个slow,fast指针先往前走N步,然后fast和slow指针一起移动,当fast->next == nullptr时,slow指向倒数第N个结点的前一个结点,此时再对slow指针进行操作。
代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* fast = dummyHead;
ListNode* slow = dummyHead;
while(n-- && fast != nullptr){
fast = fast->next;
}
//fast = fast->next;
while(fast->next != nullptr){
fast = fast->next;
slow = slow->next;
}
ListNode* temp = slow->next;
slow->next = slow->next->next;
delete temp;
return dummyHead->next;
}
};
LeetCode160.相交链表
题目描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
思路:
就是用双指针,
1. curA和curB分别指向链表A和B的头结点,当链表A为空或者链表B为空时,直接返回NULL。
2.如果都不为空,curA从链表A开始从头遍历,当遍历到NULL时,此时curA指向headB,开始遍历链表B,curB从链表B开始从头遍历,当遍历到NULL时,此时curB指向headA,开始遍历链表A,如果两个链表相交的话,此时curA遍历过的结点数和curB遍历过的结点数相等,curA和curB指向相交的第一个结点,返回curA。
原理:见文章:https://blog.csdn.net/wanttifa/article/details/124374378
代码:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA == NULL || headB == NULL){
return NULL;
}
ListNode* curA = headA;
ListNode* curB = headB;
while(curA != curB){
curA = curA == NULL ? headB : curA->next;
curB = curB == NULL ? headA : curB->next;
}
return curA;
}
};