[LeetCode]19. 删除链表的倒数第 N 个结点(java实现)快慢指针
1. 题目
2. 读题(需要重点注意的东西)
思路(快慢指针):
快慢指针
,快指针先走n步,然后慢指针和快指针一起走,直到快指针走到终点(fast.next == null),此时慢指针指向的节点的下一个节点,就是需要删除的节点。此外,需要注意要删除的是第一个节点的情况。
3. 解法
解法:迭代法
/**
* 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) {
ListNode fast = head;
ListNode slow = head;
// 快指针先走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;
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
6. 总结
链表的相关题目,考虑快慢指针是一个不错的思路