算法练习13:删除链表的倒数第 n 个结点(leetcode 1
2021-04-27 本文已影响0人
miao8862
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
解题思路:
- 设置两个指针p1, p2,p1指向头节点,p2比p1多走n步
- 当p2为空时,代表头节点为倒数第n个节点,删除头节点就好;
- 如果p2不为空,那么p1和p2同时向右移,直到p2是最后一个节点,此时p1为要删除的节点的上一个节点,直接将p1链接到下下个节点,即为删除此数
- 返回头节点
这道题不难,但找到边界值是关键
var removeNthFromEnd = function(head, n) {
// 当链表为空时,返回null
if(!head) {
return null;
}
// 当链表节点小于1时,且删除节点为1个时,返回空链表
if(!head.next && n === 1) {
return null;
}
// p2快n步指针,p1正常指针
let p1 = head;
let p2 = head;
// p2指针快走n步
while(n > 0) {
if(p2) {
p2 = p2.next;
n--;
}else {
throw new Error(`不存在这个倒数`)
}
}
// 如果此时p2已经是空的,说明头指针刚好是倒数的这个数
if(!p2) {
head = head.next
return head;
}
// p1和p2同时向后移,直到p2走到最后一个节点,p1所在的节点就为要删除的数的上一个节点
while(p2.next) {
p2 = p2.next
p1 = p1.next
}
// 删除这个倒数
p1.next = p1.next.next
// 返回链表头指针
return head;
};