题目
给定一个链表,从链表尾移除第 n 个节点,并返回链表首节点。
示例:
给定链表:1 -> 2 -> 3 -> 4 -> 5,和 n = 2。
从链表尾移除第 2 个节点后,链表为 1 -> 2 -> 3 -> 5。
注意:
给定的 n 总是有效,尝试只使用一次遍历。
难度:容易
编程语言:C++
分析
程序框架为:
|
|
一开始的思路是,先遍历链表,求出链表长度,算出需要移除哪个节点,再在第二次遍历时移除。如果只遍历一次,可以在第一次遍历时,把节点序号和指针记录到一个 map<int, ListNode*>
里,就能 O(1) 移除倒数第 n 个节点。
伪代码如下:
|
|
代码如下:
|
|
提交到 Leetcode,Wrong Answer! 导致错误的输入是 [1] 1。即是链表为 [1],移除倒数第 1 个节点。即是我的代码在移除 head 时出错。这是因为在上面代码第 50 行取 prevRemoveNode 时,removeOrder - 1 可能不存在,导致 prevRemoveNode 为 NULL。在 53 行建立与 nextRemoveNode 连接失败。
我们知道,链表中,除了 head,其它节点都有「上一个节点 prevNode」,这样在移除时,不得不对 head 作特殊判断。为了解决这个问题,统一 head 和其它节点的移除操作,我给 head 也设置一个 prevNode,即 prevHead。
代码如下:
|
|
提交到 Leetcode,Accepted! :) 运行时间为 13ms。