class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur = dummyHead;
while(cur->next != nullptr && cur->next->next != nullptr)
{
ListNode* tmp = cur->next; // 记录临时节点1
ListNode* tmp1 = cur->next->next->next; // 记录临时节点3
cur->next = cur->next->next; //cur->2
cur->next->next = tmp; //2->1
cur->next->next->next = tmp1; //1->3
cur = cur->next->next; //下次交换
}
return dummyHead->next;
}
};
cur、1、2、3
cur->2、2->1、1->3
cur、2、1、3
19.删除链表的倒数第N个节点
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 != nullptr)
{
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
// ListNode *tmp = slow->next; C++释放内存的逻辑
// slow->next = tmp->next;
// delete nth;
return dummyHead->next;
}
};
链表相交--交点不是数值相等,而是指针相等
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode * curA = headA;
ListNode * curB = headB;
int lenA = 0 ,lenB = 0;
while(curA != NULL)
{
lenA++;
curA = curA->next;
}
while(curB != NULL)
{
lenB++;
curB = curB->next;
}
curA = headA;
curB = headB;
while(lenB > lenA)
{
swap(curA,curB);
swap(lenA,lenB);
}
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;
}
};
142.环形链表II
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode * fast = head;
ListNode * slow = head;
while(fast != NULL && fast->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast){
ListNode * index1 = fast;
ListNode * index2 = head;
while(index1 != index2)
{
index1 = index1->next;
index2 = index2->next;
}return index2;
}
}
return NULL;
}
};