给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2:
输入:head = [1], n = 1 输出:[] 示例 3:
输入:head = [1,2], n = 1 输出:[1]
双指针之快慢指针解法
这里记录一下主要的解题思路:
首先,利用哨兵节点去解决头节点可能被删除的情况,然后设置一个快指针fast,慢指针slow,让快指针先走n步(n为要删除的倒数第几个节点),然后再让快慢指针同时开始移动,当快指针的next为null时,慢指针则指向要删除的节点的前一个节点。下图为没有哨兵节点的情况,主要是提供一个思路,并不是代码逻辑!!
代码如下(用了哨兵节点,逻辑其实和上图一样):
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyhead=new ListNode(0);
dummyhead.next=head;
ListNode fast=dummyhead;
ListNode slow=dummyhead;
for(int i=0;i<n;i++)
{
fast=fast.next;
}
while(fast.next!=null)
{
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;
return dummyhead.next;
}
}