一、两两交换链表中的节点
这就是一个节点交换的问题。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
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*nxt1=cur->next;
ListNode*nxt2=cur->next->next->next;
cur->next=cur->next->next;
cur->next->next=nxt1;
cur->next->next->next=nxt2;
cur=cur->next->next;
}
ListNode*result=dummyhead->next;
delete dummyhead;
return result;
}
};
二、删除链表的倒数第N个节点
思路:
找到链表倒数第n个节点,一个常用的技巧是使用两个指针。让一个指针先走n步,然后两个指针前进,当快指针到达链表末尾时,慢指针正好到达倒数第n个节点。
创建一个dummy head,它的下一个节点指向head,使用fast和slow,fast比slow快n步,然后同时移动fast和slow,直到fast指针到达末尾,此时slow->next就是要删除的,将slow指向slow->next->next。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode* dummyHead = new ListNode(0);
ListNode* Fast = dummyHead;
ListNode* Slow = dummyHead;
// 先移动Fast
for (int i = 1; i <= n; i++) {
Fast = Fast->next;
}
// 同时移动Fast和Slow
while (Fast->next != nullptr)
{
Fast=Fast->next;
Slow=Slow->next;
}
//Slow指向要删除的节点的前一个节点
ListNode* temp=Slow->next;
Slow->next=Slow->next->next;
delete temp;
ListNode* dummyHead =dummyHead->next;
delete dummyHead;
return dummyHead;
}
};