题目
给定一个链表,删除链表的倒数第 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
进阶:能尝试使用一趟扫描实现吗?
代码和思路
使用双指针,然后使用一下数学的小知识点。易错点:找到的是要删除节点的前一个节点。这样方便慢指针进行删除
/**
* 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(-1);
dummy.next = head;
// 定义双指针
ListNode p1 = dummy;
ListNode p2 = dummy;
// 让p1先走n-1步,找到倒数第n个的前以一个
for(int i = 0; i < n; i++){
p1 = p1.next;
}
// p1走完之后,开始同时迭代
while(p1.next != null){
p1 = p1.next;
p2 = p2.next;
}
// 找到点了,开始删除
p2.next = p2.next.next;
return dummy.next;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96180.html