[LeetCode] Remove Nth Node From End of List

This is a classic problem of linked list. You may solve it using two pointers. The tricky part lies in the head pointer may also be the one that is required to be removed. Handle this carefully.

复制代码
 1 class Solution {
 2 public:
 3     ListNode *removeNthFromEnd(ListNode *head, int n) {
 4         ListNode *pre, *cur;
 5         pre = cur = head;
 6         int i = 0;
 7         for(; i < n; i++)
 8             cur = cur -> next;
 9         if(!cur) return head -> next;
10         while(cur -> next) {
11             pre = pre -> next;
12             cur = cur -> next;
13         }
14         pre -> next = pre -> next -> next;
15         return head;
16     }
17 };
复制代码

You may create a dummy that points to head to facilitate the removal.

复制代码
 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) {
 4         ListNode* dummy = new ListNode(0);
 5         dummy -> next = head;
 6         ListNode* pre = dummy;
 7         ListNode* cur = dummy;
 8         for (int i = 0; i < n; i++)
 9             cur = cur -> next;
10         while (cur -> next) {
11             pre = pre -> next;
12             cur = cur -> next;
13         }
14         ListNode* del = pre -> next;
15         pre -> next = del -> next;
16         delete del;
17         return dummy -> next;
18     }
19 };
复制代码

This link has a much shorter solution using pointers to pointers, which is a little difficult to understand. The code is rewritten below.

复制代码
 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) {
 4         ListNode** pre = &head;
 5         ListNode* cur = head;
 6         for (int i = 1; i < n; i++)
 7             cur = cur -> next;
 8         while (cur -> next) {
 9             pre = &((*pre) -> next);
10             cur = cur -> next;
11         }
12         *pre = (*pre) -> next;
13         return head;
14     }
15 };
复制代码

There is also a recursive solution to this problem in the answers in the above link. 

复制代码
 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) {
 4         return countRemove(head, n) == 0 ? head -> next : head;
 5     }
 6 private:
 7     int countRemove(ListNode* node, int n) {
 8         if (!(node -> next)) return n - 1;
 9         int rest = countRemove(node -> next, n);
10         if (!rest) node -> next = node -> next -> next;
11         return rest - 1;
12     }
13 };
复制代码

 

posted @   jianchao-li  阅读(215)  评论(0编辑  收藏  举报
编辑推荐:
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
阅读排行:
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 开发的设计和重构,为开发效率服务
点击右上角即可分享
微信分享提示