|
50 | 50 |
|
51 | 51 | <!-- 这里可写通用的实现逻辑 -->
|
52 | 52 |
|
53 |
| -利用快慢指针。 |
| 53 | +**方法一:快慢指针** |
| 54 | + |
| 55 | +定义两个指针 `fast` 和 `slow`,初始时都指向链表的虚拟头结点 `dummy`。 |
| 56 | + |
| 57 | +接着 `fast` 指针先向前移动 $n$ 步,然后 `fast` 和 `slow` 指针同时向前移动,直到 `fast` 指针到达链表的末尾。此时 `slow.next` 指针指向的结点就是倒数第 `n` 个结点的前驱结点,将其删除即可。 |
| 58 | + |
| 59 | +时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为链表的长度。 |
54 | 60 |
|
55 | 61 | <!-- tabs:start -->
|
56 | 62 |
|
|
65 | 71 | # self.val = val
|
66 | 72 | # self.next = next
|
67 | 73 | class Solution:
|
68 |
| - def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: |
| 74 | + def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]: |
69 | 75 | dummy = ListNode(next=head)
|
70 | 76 | fast = slow = dummy
|
71 | 77 | for _ in range(n):
|
@@ -151,19 +157,16 @@ public:
|
151 | 157 | * }
|
152 | 158 | */
|
153 | 159 | func removeNthFromEnd(head *ListNode, n int) *ListNode {
|
154 |
| - dummy := &ListNode{0, head} |
155 |
| - fast := dummy |
156 |
| - slow := dummy |
157 |
| - for n > 0 { |
158 |
| - fast = fast.Next |
159 |
| - n -= 1 |
160 |
| - } |
161 |
| - for fast.Next != nil { |
162 |
| - slow = slow.Next |
163 |
| - fast = fast.Next |
164 |
| - } |
165 |
| - slow.Next = slow.Next.Next |
166 |
| - return dummy.Next |
| 160 | + dummy := &ListNode{0, head} |
| 161 | + fast, slow := dummy, dummy |
| 162 | + for ; n > 0; n-- { |
| 163 | + fast = fast.Next |
| 164 | + } |
| 165 | + for fast.Next != nil { |
| 166 | + slow, fast = slow.Next, fast.Next |
| 167 | + } |
| 168 | + slow.Next = slow.Next.Next |
| 169 | + return dummy.Next |
167 | 170 | }
|
168 | 171 | ```
|
169 | 172 |
|
@@ -265,6 +268,37 @@ impl Solution {
|
265 | 268 | }
|
266 | 269 | ```
|
267 | 270 |
|
| 271 | +### **TypeScript** |
| 272 | + |
| 273 | +```ts |
| 274 | +/** |
| 275 | + * Definition for singly-linked list. |
| 276 | + * class ListNode { |
| 277 | + * val: number |
| 278 | + * next: ListNode | null |
| 279 | + * constructor(val?: number, next?: ListNode | null) { |
| 280 | + * this.val = (val===undefined ? 0 : val) |
| 281 | + * this.next = (next===undefined ? null : next) |
| 282 | + * } |
| 283 | + * } |
| 284 | + */ |
| 285 | + |
| 286 | +function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null { |
| 287 | + const dummy = new ListNode(0, head); |
| 288 | + let fast = dummy; |
| 289 | + let slow = dummy; |
| 290 | + while (n--) { |
| 291 | + fast = fast.next; |
| 292 | + } |
| 293 | + while (fast.next) { |
| 294 | + slow = slow.next; |
| 295 | + fast = fast.next; |
| 296 | + } |
| 297 | + slow.next = slow.next.next; |
| 298 | + return dummy.next; |
| 299 | +} |
| 300 | +``` |
| 301 | + |
268 | 302 | ### **...**
|
269 | 303 |
|
270 | 304 | ```
|
|
0 commit comments