题目:
给你一个链表,删除链表的倒数第 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]
代码:
1.双指针:快慢指针
原理:fast与slow之间相差n+1,fast到null时,slow恰好为被删节点前一个节点。
步骤:
(1)定义fast指针和slow指针,初始值为虚拟头结点;
(2)fast首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作);
(3)fast和slow同时移动,每次走一步,直到fast指向末尾;
(4)被删节点为slow下一个,删除slow指向的下一个节点
总结:如果链表说到倒数,可以用快慢指针试试!
/**
* 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 dummy = new ListNode(0, head);
ListNode slow = dummy;
ListNode fast = dummy;
while (n-- >= 0) {
fast = fast.next;
}
while (fast != null) {
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return dummy.next; // 有可能head被删了,不能写return head;
}
}
参考:代码随想录
|