给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
这个算法可以通过直接遍历出链表的长度,再根据长度再次遍历删除第N个结点。
我这里主要用的是双指针算法,通过两个快慢节点遍历链表,
这个算法好处就是只遍历一次。
先让fast节点前进N个节点
slow每次都是在待删除的前一个节点, 所以要先让fast先走一步
让slow结点和fast节点同时走,每次走一步
当fast点走完时
slow的下一节点就是要删除第N个节点
代码如下:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = head;
ListNode slow = head;
//先让快指针走n步
while(n--!=0){
fast = fast.next;
}
//如果刚好走完,删除第一节点(返回第二个节点
)
if(fast==null){
return head.next;
}
//slow每次都是在待删除的前一个节点, 所以要先让fast先走一步
fast = fast.next;
//slow结点和fast节点同时走
while(fast!=null){
fast = fast.next;
slow = slow.next;
}
//删除节点的前一个节点
slow.next = slow.next.next;
return head;
}