21.03.08 LeetCode19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
/** * 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) { if(head.next == null) return null; //取first指针和second指针,first指针先走n步,与second间隔n个节点 ListNode first = head; ListNode N = new ListNode(-1,head);//这里有个小细节,为head建立一个头结点,让second指针从head前一位置出发 ListNode second = N;
//因为如果second从head开始走,当while终止时会走到我们要删除的那个节点,不方便删除
//因此,在走相同步数的前提下,让second提前一个位置出发,则终止时会走到要删除的节点的前一个,方便后续直接删除
for(int i = 0;i<n;i++) first = first.next;
while(first!=null) { second = second.next; first = first.next; } second.next =second.next.next; return N.next; } }