码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode(19):删除链表的倒数第N个节点

时间:2018-06-03 12:21:55      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:span   while   位置   nbsp   节点   head   null   思路   实现   

Medium!

题目描述:

给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

解题思路:

这道题让我们移除链表倒数第N个节点,限定n一定是有效的,即n不会大于链表中的元素总数。还有题目要求我们一次遍历解决问题,那么就得想些比较巧妙的方法了。比如我们首先要考虑的是,如何找到倒数第N个节点,由于只允许一次遍历,所以不能用一次完整的遍历来统计链表中元素的个数,而是遍历到对应位置就应该移除了。那么我们需要用两个指针来帮助我们解题,pre和cur指针。首先cur指针先向前走N步,如果此时cur指向空,说明N为链表的长度,则需要移除的为首元素,此时返回head->next即可,如果cur存在,再继续往下走,此时pre指针也跟着走,直到cur为最后一个元素时停止,此时pre指向要移除元素的前一个元素,再修改指针跳过需要移除的元素即可。

C++代码:

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

 

LeetCode(19):删除链表的倒数第N个节点

标签:span   while   位置   nbsp   节点   head   null   思路   实现   

原文地址:https://www.cnblogs.com/ariel-dreamland/p/9128242.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!