letcode 分类练习 两两交换链表中的节点 删除链表的倒数第N个节点 链表相交 环形链表II
两两交换链表中的节点
双指针法解决(slow fast),这里我们用first和second分别暂存一下第一个和第二个节点,可以大大避免出错的可能性
/**
* 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(-1);
dummyhead -> next = head;
ListNode* slow = dummyhead; ListNode* fast = dummyhead -> next;
if(!fast) return dummyhead -> next;
while(fast && fast -> next){
ListNode* post = fast -> next -> next;
ListNode* second = fast -> next;
ListNode* fisrt = slow -> next;
slow -> next = second;
second -> next = fisrt;
fisrt -> next = post;
slow = fisrt;
fast = post;
}
return dummyhead -> next;
}
};
删除链表的倒数第N个节点
快慢指针解决,我们用一个虚拟头结点来实现找倒数第一个节点的前驱,遍历while(n–)的时候初始化虚拟头结点即可以找到。
我们先让快节点走n次,然后快节点和慢节点同步走,快节点的下一个节点为空的时候(不然slow->next->next会报空指针异常)慢节点即就是我们要找的倒数第N个节点的前驱
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyhead = new ListNode(-1);
dummyhead -> next = head;
ListNode* slow = dummyhead; ListNode* fast = dummyhead;
while(n--){
fast = fast -> next;
}
while(fast->next){
fast = fast