题目描述:
Given a linked list, remove the n th node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Note: Given n will always be valid. Try to do this in one pass.
解题思路:
- 首先弄清题意,这道题的意思就是说,删除链表中的倒数第 n 个节点,且只能有一次循环
- 这里我们可以采用快慢指针的方式来解决一次遍历的问题,fast 指针先走 n 步,那么 fast 与 slow 指针的差距就是 n 了。
- 然后就是 fast 走一步, slow 走一步,当 fast 走到尾节点的时候,slow 正好指向要删除节点的前一个节点,这时候执行删除节点即可
- 注意临界节点,比如要删除的是头节点和尾节点
代码如下:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = head;
ListNode slow = head;
// 令 fast 先走 n 步
while(n > 0){
fast = fast.next;
n--;
}
// 如果删除的节点是头节点
if(fast == null) return head.next;
// 每个指针依次走一步
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
// 删除指定节点
slow.next = slow.next.next;
return head;
}