题目
leetcode-cn.com/problems/re… 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
思路
这题思路也很简单,就是快慢指针。让快指针先走n步,然后慢指针开始走,快指针=null的时候,慢指针刚好是倒数第n个节点。注意点:
1、判别条件是fast==null
2、while中是大于0
3、题目要求的是删去第n个节点,单向链表没有pre指针只有next,所以不好删,所以要让slow停在倒数n+1个节点,然后用next删节点。
4、但是3又会出现一个问题就是链表只有一个元素的时候,找倒数第一个,这时候n+1=2就会超界,所以要用一个伪头节点 dummyhead。最后输出dummyhead.next
代码
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null){
return null;
}
ListNode dummyhead = new ListNode(0);
dummyhead.next = head;
ListNode fast = dummyhead;
ListNode slow = dummyhead;
n = n + 1;
while(n-->0){
fast=fast.next;
}
while(fast != null){
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return dummyhead.next;
}
}