1 题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
2 思路
这道题通过添加prev指针的方法,只完整遍历一次链表,就找到倒数的节点
3代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
var list = head;
var prev = head;
prev.prev = null;
var len = 1;
while(list.next) { //遍历并添加prev指针
list = list.next;
list.prev = prev;
prev = list;
len ++;
}
if (len < n) return head; //如果超出链表长度,直接返回原列表
while(--n > 0) { //找到倒数第n个节点
list = list.prev;
}
if (list.prev === null) { //如果是第一个节点
return list.next;
} else {
if (n > 1) list.next.prev = list.prev; //最后一个节点要处理一下
list.prev.next = list.next;
return head;
}
};