Leetcode-019-删除链表的倒数第N个节点

Leetcode-019-删除链表的倒数第N个节点

题目描述

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

1
2
3
4
5
示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

方法:两次遍历

  • 首先从头节点开始对链表进行一次遍历,得到链表长度L
  • 随后我们再从头节点开始对链表进行一次遍历,当遍历到链表的第L - n + 1个节点时,他就是我们需要删除的节点
  • 为了和提题目中的n保持一致,节点的编号从1开始,头节点为编号1的节点。

mark

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 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) {
// dummynode: 将next指针指向链表的头节点,这样一来就不需要对头节点进行特殊的判断
ListNode dummy = new ListNode(0);
dummy.next = head;

// 计算链表的长度
int length = getLength(head);

// 遍历链表进行删除
ListNode cur = dummy;
for(int i = 1; i < length - n + 1;++i){
cur = cur.next;
}

cur.next = cur.next.next; // 断开链表
ListNode ans = dummy.next; // 返回断开后的新头节点
return ans;
}

// 计算链表长度
public int getLength(ListNode head){
int length = 0;
while(head != null){
++length;
head = head.next;
}
return length;
}
}

复杂度分析

  • 时间复杂度 : O(L) L是链表的长度
  • 空间复杂度 : O (1) 没有使用额外的空间
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信