赞
踩
题目描述
给你一个链表,删除链表的倒数第
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
Related Topics
- 链表
- 双指针
思路:
在单链表中当指针经过这个节点的时候就无法再找到这个节点及这个节点的任意一个前驱节点,所以我们需要借助另外的指针来完成前驱节点的定位,假如我有一根n米的棍子和一根m米的绳子(m<=n)我将绳子一端固定到棍子尾部,那么绳子另一端就是棍子尾部的前m米处,如下图
两个节点开始都在头节点处,先让q指针向前走n个节点到达下图状态
最后两个节点再同时前进直到q节点走到最后的位置,那么p节点就是倒数第n个节点
- class Solution {
- public ListNode removeNthFromEnd(ListNode head, int n) {
- ListNode p = head;
- ListNode q = head;
- ListNode t = head;
- for (int i = 1; i < n; i++) {
- q = q.next;
- }
- //如果q在前进n步后变成了最后一个节点说明要删除的节点为第一个
- if (q != null && q.next == null) {
- return head.next;
- }
- while (q.next != null) {
- t = p;
- p = p.next;
- q = q.next;
- }
- t.next = p.next;
- return head;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。