LC19-Remove Nth Node From End of List

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 };
代码

猜你喜欢

转载自www.cnblogs.com/osoii/p/12980168.html