- step 1:给链表添加一个表头,处理删掉第一个元素时比较方便。
- step 2:准备一个快指针,在链表上先走nnn步。
- step 3:准备慢指针指向原始链表头,代表当前元素,前序节点指向添加的表头,这样两个指针之间相距就是一直都是nnn。
- step 4:快慢指针同步移动,当快指针到达链表尾部的时候,慢指针正好到了倒数nnn个元素的位置。
- step 5:最后将该节点前序节点的指针指向该节点后一个节点,删掉这个节点。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//添加表头
ListNode* res = new ListNode(-1);
res->next = head;
//当前节点
ListNode* cur = head;
//前序节点
ListNode* pre = res;
ListNode* fast = head;
//快指针先行n步
while(n--)
fast = fast->next;
//快慢指针同步,快指针到达末尾,慢指针就到了倒数第n个位置
while(fast != NULL){
fast = fast->next;
pre = cur;
cur = cur->next;
}
//删除该位置的节点
pre->next = cur->next;
//返回去掉头
return res->next;
}
};
注:
1.要建立头节点,因为可能会对第一个元素进行改动。
2. 执行n步除了可以用 for(int i=0;i<n;i++) 控制,还可以用 while
(n--)