链表
删除链表的倒数第n个节点
遍历2此
双指针
-
设置虚拟节点
dummyHead
指向head
-
设定双指针
p
和q
,初始都指向虚拟节点dummyHead
-
移动
q
,直到p
与q
之间相隔的元素个数为n
-
同时移动
p
与q
,直到q
指向的为NULL
-
返回虚拟头节点的下一个元素
示意图
代码实现
package com.vitamin.list;
/**
* 删除倒数第N个节点
*/
public class RemoveNthFromEnd {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dumyNode = new ListNode(-1, head);
ListNode slowNode = dumyNode;
ListNode fastNode = dumyNode;
// 使得快慢指针相隔的元素个数为n
for (int i = 0; i <= n; i++) {
fastNode = fastNode.next;
}
while (fastNode != null) {
fastNode = fastNode.next;
slowNode = slowNode.next;
}
slowNode.next = slowNode.next.next;
return dumyNode.next;
}
}