19.【中等】删除链表的倒数第N个节点
文章发布较早,内容可能过时,阅读注意甄别。
# 题目来源:
(题目来源 (opens new window) " 19.【中等】删除链表的倒数第N个节点")
# 题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
1
2
3
2
3
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
## 分析
这里设置三个变量,`current`, `reverseHead`, `next`
其中 `current` 指当前循环到的节点,`reverseHead` 是新的链表,next指向下一个节点
第一次循环时
先把next节点找出来,为
next = current.next
reverseHead为空节点的节点头部,然后把current这个节点指向 `current`
这个时候,
current.next = reverseHead.next;
完成了第一个节点的指向,指完之后,要把reverseHead移到当前节点,
即 reverseHead.next = current
然后把current指向下一个节点
current = next;
然后一次循环即可
## 题解
方法一
```java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) return head;
ListNode current = head;
ListNode next = current.next;
ListNode reverseHead = new ListNode(0);
while (current != null) {
next = current.next;
current.next = reverseHead.next;
reverseHead.next = current;
current = next;
}
return reverseHead.next;
}
}
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
41
42
43
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
41
42
43
输入
[1,2,3,4,5]
输出
[5,4,3,2,1]
1
2
3
4
5
2
3
4
5
上次更新: 2024/03/07, 20:33:54