力扣题目
解题思路
java代码
力扣题目:
给你一个链表,删除链表的倒数第 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]
提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
解题思路:
-
初始化哑节点:创建一个哑节点(dummy node),它的下一个节点指向头节点(head)。哑节点的作用是在删除头节点时简化操作,因为头节点没有前驱节点。
-
设置两个指针:使用两个指针
first
和second
,都初始化为指向哑节点。first
指针先向前移动n
步,这样first
和second
之间就保持了n
个节点的距离。 -
同步移动指针:当
first
指针移动n
步后,同时移动first
和second
指针,直到first
指针指向链表的最后一个节点。此时,second
指针的下一个节点就是需要删除的节点。 -
删除节点:通过改变
second
指针的next
指向,跳过需要删除的节点,即second.next = second.next.next
。 -
返回结果:返回哑节点的下一个节点,即新的头节点。
具体步骤如下:
- 假设链表为:1 -> 2 -> 3 -> 4 -> 5,要删除倒数第2个节点。
- 初始化哑节点:0 -> 1 -> 2 -> 3 -> 4 -> 5。
first
指针先移动2步,指向3。- 同时移动
first
和second
指针,直到first
指向5,此时second
指向3。 - 删除
second
的下一个节点,即删除4。 - 最终链表变为:0 -> 1 -> 2 -> 3 -> 5,返回哑节点的下一个节点,即1 -> 2 -> 3 -> 5。
java代码:
package org.example.mouth7.today715;
public class Leetcode19 {
public static void main(String[] args) {
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
ListNode res = removeNthFromEnd(head, 2);
while (res != null) {
System.out.println(res.val);
res = res.next;
}
}
public static ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0, head);
ListNode first = head;
ListNode second = dummy;
for (int i = 0; i < n; ++i) {
first = first.next;
}
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
ListNode ans =dummy.next;
return ans;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项