热门题,难度中等题。
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
很明显,经典的双指针,就算没看过双指针相关,也应该能想到两个遍历下标保持n的距离,当快的到了终点,那么现在的就是要删除的。
要注意的一个地方就是养成考虑特殊情况的习惯,删除第一个。删除第一个的话就需要一个头指针,简化操作。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode res = new ListNode(-1);
res.next = head;
ListNode lowNode = res;
ListNode highNode = res;
while (true){
highNode = highNode.next;
if (n > 0) --n;
else lowNode = lowNode.next;
if (highNode.next == null){
lowNode.next = lowNode.next.next;
break;
}
}
return res.next;
}
}