题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
题目链接
思路
使用两个指针,都指向头节点 head。然后先让第二个先走 n-1步。这样可以保证当第二个指针走到末尾链表最后一个的时候,第一个指针更好是倒数第 n个。
必要时候,画图理解
代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null) return null;
ListNode slow = head;
ListNode fast = head;
ListNode prev = null;
// 先让快的指针先走 n-1步(对于知道步数的计算需要使用 for循环比较清晰)
for(int i=0; i<n-1; i++){
fast = fast.next;
}
// 处理特殊情况,如果快的指针走了 n-1步,
// 发现自己已经到了链表末尾了,说明需要删除的是第一个元素
if(fast.next == null){
return head.next;
}
while(fast.next != null){
prev = slow;
slow = slow.next;
fast = fast.next;
}
prev.next = slow.next;
slow.next = null;
return head;
}
}