title: Leetcode 19.删除链表的倒数第N个节点
hidden: true
tags:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
既然没有给链表的长度, 一个指针是没法用一边扫描实现的. 所以用两个指针, 一开始两个指针slow和fast都指向头结点, 让fast指针先走n步, 之后两个指针一起走, 在fast到NULL时候,
#include<bits/stdc++.h>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
// @lc code=start
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head == NULL) return NULL;
if(head->next == NULL) return n == 1 ? NULL : head;
ListNode* slow = head;
ListNode* fast = slow;
for(int i = 0; i < n; ++i) {
fast = fast->next;
}
if(fast == NULL) return head->next;
while(fast->next != NULL) {
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
return head;
}
};
// @lc code=end