17
17
18
18
## 解法
19
19
20
- 定义快慢指针 ` slow ` 、 ` fast ` ,初始指向 ` head ` 。
20
+ ** 方法一:快慢指针 **
21
21
22
- ` fast ` 先向前走 ` k ` 步,接着 ` slow ` 、` fast ` 同时向前走,当 ` fast ` 指向 ` null ` 时,` slow ` 指向的节点即为链表的倒数第 ` k ` 个节点。
22
+ 我们可以定义快慢指针 ` fast ` 和 ` slow ` ,初始时均指向 ` head ` 。
23
+
24
+ 然后快指针 ` fast ` 先向前走 $k$ 步,然后快慢指针同时向前走,直到快指针走到链表尾部,此时慢指针指向的节点就是倒数第 $k$ 个节点。
25
+
26
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为链表长度。
23
27
24
28
<!-- tabs:start -->
25
29
@@ -39,8 +43,7 @@ class Solution:
39
43
for _ in range (k):
40
44
fast = fast.next
41
45
while fast:
42
- slow = slow.next
43
- fast = fast.next
46
+ slow, fast = slow.next, fast.next
44
47
return slow
45
48
```
46
49
@@ -70,33 +73,76 @@ class Solution {
70
73
}
71
74
```
72
75
76
+ ### ** C++**
77
+
78
+ ``` cpp
79
+ /* *
80
+ * Definition for singly-linked list.
81
+ * struct ListNode {
82
+ * int val;
83
+ * ListNode *next;
84
+ * ListNode(int x) : val(x), next(NULL) {}
85
+ * };
86
+ */
87
+ class Solution {
88
+ public:
89
+ ListNode* getKthFromEnd(ListNode* head, int k) {
90
+ ListNode * slow = head, * fast = head;
91
+ while (k--) {
92
+ fast = fast->next;
93
+ }
94
+ while (fast) {
95
+ slow = slow->next;
96
+ fast = fast->next;
97
+ }
98
+ return slow;
99
+ }
100
+ };
101
+ ```
102
+
103
+ ### **Go**
104
+
105
+ ```go
106
+ /**
107
+ * Definition for singly-linked list.
108
+ * type ListNode struct {
109
+ * Val int
110
+ * Next *ListNode
111
+ * }
112
+ */
113
+ func getKthFromEnd(head *ListNode, k int) *ListNode {
114
+ slow, fast := head, head
115
+ for ; k > 0; k-- {
116
+ fast = fast.Next
117
+ }
118
+ for fast != nil {
119
+ slow, fast = slow.Next, fast.Next
120
+ }
121
+ return slow
122
+ }
123
+ ```
124
+
73
125
### ** JavaScript**
74
126
75
127
``` js
128
+ /**
129
+ * Definition for singly-linked list.
130
+ * function ListNode(val) {
131
+ * this.val = val;
132
+ * this.next = null;
133
+ * }
134
+ */
76
135
/**
77
136
* @param {ListNode} head
78
137
* @param {number} k
79
138
* @return {ListNode}
80
139
*/
81
140
var getKthFromEnd = function (head , k ) {
82
- // 递归
83
- // let cnt = 1
84
- // function func(node) {
85
- // if(!node || !node.next) return node
86
- // let newNode = func(node.next)
87
- // if(cnt === k) return newNode
88
- // else cnt++
89
- // return node
90
- // }
91
- // return func(head)
92
-
93
- // 快慢指针
94
- let slow = head;
95
141
let fast = head;
96
- while (k) {
142
+ while (k-- ) {
97
143
fast = fast .next ;
98
- k-- ;
99
144
}
145
+ let slow = head;
100
146
while (fast) {
101
147
slow = slow .next ;
102
148
fast = fast .next ;
@@ -105,44 +151,6 @@ var getKthFromEnd = function (head, k) {
105
151
};
106
152
```
107
153
108
- ### ** Go**
109
-
110
- ``` go
111
- func getKthFromEnd (head *ListNode , k int ) *ListNode {
112
- tmp := head
113
- for tmp != nil && k > 0 {
114
- tmp = tmp.Next
115
- k--
116
- }
117
- slow := head
118
- fast := tmp
119
- for fast != nil {
120
- fast = fast.Next
121
- slow = slow.Next
122
- }
123
- return slow
124
- }
125
- ```
126
-
127
- ### ** C++**
128
-
129
- ``` cpp
130
- class Solution {
131
- public:
132
- ListNode* getKthFromEnd(ListNode* head, int k) {
133
- ListNode * slow = head, * fast = head;
134
- while (k--) {
135
- fast = fast->next;
136
- }
137
- while (fast) {
138
- slow = slow->next;
139
- fast = fast->next;
140
- }
141
- return slow;
142
- }
143
- };
144
- ```
145
-
146
154
### ** Rust**
147
155
148
156
``` rust
@@ -192,12 +200,12 @@ impl Solution {
192
200
public class Solution {
193
201
public ListNode GetKthFromEnd (ListNode head , int k ) {
194
202
ListNode fast = head , slow = head ;
203
+ while (k -- > 0 ) {
204
+ fast = fast .next ;
205
+ }
195
206
while (fast != null ) {
207
+ slow = slow .next ;
196
208
fast = fast .next ;
197
- k -= 1 ;
198
- if (k < 0 ) {
199
- slow = slow .next ;
200
- }
201
209
}
202
210
return slow ;
203
211
}
0 commit comments