题目:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
抛砖引玉
思路:
计算链表总长度,倒数第 N 个节点就是第 len-n 个节点
在链表头部增加一个哑节点(dummy node),来方便处理删除节点 1 的情况
0->1->2->3->4->5
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
let _result = new ListNode(0, head),
node = _result,
len = 0,
index = 0
while (head) {
len++
head = head.next
}
// 更新node指针到len-n位置
for (let i = 1; i < len - n + 1; i++) {
node = node.next
}
// 跳过le-n位置的节点之间连接其next上的节点完成删除
node.next = node.next ? node.next.next : null
return _result.next
}
一次遍历
声明两个指针中间差 n 步,那么前面的指针到链表尾部时,后面的指针就刚好在倒数第 n 的位置上
var removeNthFromEnd = function(head, n) {
let _result = new ListNode(0, head),
start = _result,
end = head,
index = 0
while (index < n) {
end = end.next
index++
}
while (end !== null) {
end = end.next
start = start.next
}
start.next = start.next.next
return _result.next
}
博客: 前端小书童
每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言