#19.remove-nth-node-from-end-of-list
题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例 :
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
- 使用map存储链表每个节点,然后遍历链表直到next为null,然后找到前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 map = {}, i = 0, nextNode = head;
while(true){
map[i] = nextNode;
i++;
nextNode = nextNode.next;
if(!nextNode){
break;
}
}
var delNode = map[i - n];
if(!delNode.next){
var prevNode = map[i - n - 1];
if(!prevNode){
return null
}
prevNode.next = null
return map[0]
}
delNode.val = delNode.next.val
delNode.next = delNode.next.next
return map[0]
};
- 第一次遍历求长度,第二次遍历删除元素
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
function ListNode(val) {
this.val = val;
this.next = null;
}
var removeNthFromEnd = function(head, n) {
var dummy = new ListNode(0);
dummy.next = head;
var p = head, l = 0;
while(p !== null){
p = p.next;
l++;
}
l = l - n; p = dummy;
while(l > 0) {
p = p.next;
l--;
}
p.next = p.next.next;
return dummy.next
};
- 一次遍历,先移动快指针到n的位置,再同时移动快慢指针,使两个指针保持n的距离,这样,当快指针到达结尾的时候,慢指针就到达倒数第n个了
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
function ListNode(val) {
this.val = val;
this.next = null;
}
var removeNthFromEnd = function(head, n) {
var dummy = new ListNode(0);
dummy.next = head;
var p = head, q = dummy, l = 0;
for (let i = 1; i <= n; i++) {
p = p.next;
}
while(p !== null){
p = p.next;
q = q.next;
}
q.next = q.next.next;
return dummy.next
};
- 一般会在头部外再加一个节点,防止删除头元素的问题
- 链表的操作一般只有指针,单指针和双指针,思路尽量向这方面靠拢