删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
解题思路
通过观察示例可知,删除第n个节点,即删除从链表开头的第(l-n+1)个节点,其中l表示链表的长度,即我们首先需要求出当前链表的长度。
首先我们添加一个哑结点作为辅助,该节点位于链表的头部,哑结点用来简化某些极端情况,例如链表中只含有一个节点,或需要删除链表头部的节点。在第一次遍历中,求出链表的长度l,然后设置一个指向哑结点的指针,并移动它遍历链表,直至它到达(l - n)个,即倒数第n的前一个节点,将第(l - n)个节点的next指针重新指向n的下一个节点,即(l - n +2)个节点,即删除了倒数第n个结点。
/**
* 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 dummy = new ListNode(0) // 哑结点
dummy.next = head
var len = 0
var first = head
//求链表的长度
while(first != null){
len++
first = first.next
}
//遍历到n前一个节点,使其指向n的下一个节点
len = len - n
first = dummy
while(len > 0){
len--
first = first.next
}
first.next = first.next.next
return dummy.next
};