# 代码题（67）— 删除链表的倒数第 N 个结点、链表中倒数第 K个节点、移除链表元素

### 1、19. 删除链表的倒数第 N 个结点

双指针的经典应用，如果要删除倒数第n个节点，让fast移动n步，然后让fast和slow同时移动，直到fast指向链表末尾。删掉slow所指向的节点就可以了。

/**
* 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) {
return nullptr;
ListNode* dummy = new ListNode(-1);
ListNode* fast = dummy;
ListNode* slow = dummy;
for(int i=0;i < n+1 ;++i){
if(fast == nullptr){
return nullptr;
}
fast = fast->next;
}
while(fast) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummy->next;
}
};

### 2、链表中倒数第k个结点

   ListNode* FindKthToTail(ListNode* head, int k) {
if(head == nullptr || k <= 0){
return nullptr;
}
for(int i=0;i<k;++i){
if(fast == nullptr)
return nullptr;
fast = fast->next;
}
while(fast){
fast = fast->next;
slow = slow->next;
}
return slow;
}

### 3、203. 移除链表元素

/**
* 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* removeElements(ListNode* head, int val) {
return nullptr;
ListNode* dummy = new ListNode(-1);
ListNode* pre = dummy;
ListNode* cur = pre->next;
while(cur){
if(cur->val == val){
cur = cur->next;
pre->next = cur;
} else {
pre = cur;
cur = cur->next;
}
}
return dummy->next;
}
};

posted @ 2021-05-24 23:28  深度机器学习  阅读(69)  评论(0编辑  收藏  举报