https://leetcode.com/problems/remove-nth-node-from-end-of-list/
给一个链表,要求删掉倒数第n个结点
首先最直观的做法就是,先遍历一遍整个链表,从而知道链表到底有多长,进而知道倒数第n个结点是正数第几个结点,再次遍历链表删除该结点即可
但本题可以用双指针思路进行优化
核心思想就是,一个指针跑得快,另一个指针跑得慢,慢的指针在跑得快的指针跑到n之后再开始跑
目的就是,当快指针跑到链表尾部的时候,慢指针恰好跑到倒数第n+1个结点(也就是目标结点的前一个结点),这样利用慢指针就可以删掉目标结点
需要注意的是,如果要删的结点是头结点,因为头结点前面没有结点,因此需要做一下特判
1 class Solution { 2 public: 3 ListNode* removeNthFromEnd(ListNode* head, int n) { 4 int num = 1; 5 ListNode* first = head; 6 ListNode* second = head; 7 while (first->next) { 8 first = first->next; 9 if (num > n) second = second->next; 10 num++; 11 } 12 if (num > n) 13 second->next = second->next->next; 14 else 15 head = head->next; 16 17 return head; 18 } 19 };