博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Remove Nth Node From End of List
阅读量:5903 次
发布时间:2019-06-19

本文共 2311 字,大约阅读时间需要 7 分钟。

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

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

 

转载地址:http://wqupx.baihongyu.com/

你可能感兴趣的文章
MVC5+EF6 入门完整教程八
查看>>
Java 设计模式专栏
查看>>
常用Mysql或者PostGresql或者Greenplum的语句总结。
查看>>
工控随笔_12_西门子_WinCC的VBS脚本_03_变量类型
查看>>
appium 报错
查看>>
phpquery中文手册
查看>>
微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程
查看>>
【转】C++ 笔试面试题目
查看>>
同步和异步的区别
查看>>
在ASP.NET MVC控制器中获取链接中的路由数据
查看>>
使用ASP.NET Atlas SortBehavior实现客户端排序
查看>>
图像滤镜处理算法:灰度、黑白、底片、浮雕
查看>>
多线程一个错误的例子
查看>>
默认网关及route print
查看>>
Servlet如何处理一个请求?
查看>>
使用Jquery+CSS如何创建流动导航菜单-Fluid Navigation
查看>>
Office文档出错的几种原因与解决方法
查看>>
【实验报告】实验二:DHCP基本实验
查看>>
气质的培养(哈佛管理世界)
查看>>
Can&#39;t get Kerberos realm
查看>>