Skip to content

Commit 32b45c4

Browse files
author
weiy
committed
remove Nth Node from end of list medium
1 parent 36ed7d3 commit 32b45c4

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

Diff for: Array/RemoveNthNodeFromEndOfList.py

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
"""
2+
Given a linked list, remove the n-th node from the end of list and return its head.
3+
4+
Example:
5+
6+
Given linked list: 1->2->3->4->5, and n = 2.
7+
8+
After removing the second node from the end, the linked list becomes 1->2->3->5.
9+
Note:
10+
11+
Given n will always be valid.
12+
13+
Follow up:
14+
15+
Could you do this in one pass?
16+
17+
给一个链表和一个n,删除从后数第n个节点。
18+
19+
n总是有效的。
20+
21+
进阶条件是一次性完成。
22+
23+
一开始的想法是总得先知道长度,然后才能倒数第n个吧。
24+
所以一开始用的列表,Python 中的列表非常适合做这个操作。
25+
O(n) 遍历,然后剩下的索引操作就是 O(1) 了。
26+
27+
失误的是,考虑到了如果删除的是head,但是写的话没写成 head.next,写成了 list_node[1],
28+
这样在链表中只有一个节点的时候就出错了...
29+
30+
本题算是失败了。2 pass.
31+
32+
效率上是 28ms。
33+
34+
看了25ms的写法,感觉非常聪明。
35+
以前总是想,这样的必须得先过一遍知道长度才能做其他的事吧。
36+
这个的写法是,用一条像是绳子一样的。
37+
|----------|
38+
slow fast
39+
40+
让fast走n步。
41+
然后fast和slow一起走,等fast.next是None,也就是到头了。那么slow就是要删除的点的前一个了。
42+
直接把slow.next与slow.next.next结合就达标了。
43+
如果走了n步后fast直接是None了。那么说明删除的节点是head,那么返回 head.next就好了。
44+
45+
不过这个提交了两次也是 28ms..
46+
但是这个思路是真的棒。
47+
48+
关键词:
49+
绳子。
50+
51+
测试地址:
52+
https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/
53+
54+
55+
56+
"""
57+
# Definition for singly-linked list.
58+
# class ListNode(object):
59+
# def __init__(self, x):
60+
# self.val = x
61+
# self.next = None
62+
63+
class Solution(object):
64+
def removeNthFromEnd(self, head, n):
65+
"""
66+
:type head: ListNode
67+
:type n: int
68+
:rtype: ListNode
69+
"""
70+
my_head = my_trail = head
71+
for i in range(n):
72+
my_head = my_head.next
73+
74+
if not my_head:
75+
return head.next
76+
77+
while my_head.next:
78+
my_head = my_head.next
79+
my_trail = my_trail.next
80+
81+
my_trail.next = my_trail.next.next
82+
83+
return head
84+
# list_node = []
85+
# my_head = head
86+
# while my_head:
87+
# list_node.append(my_head)
88+
# my_head = my_head.next
89+
90+
# if n == len(list_node):
91+
# try:
92+
# return list_node[1]
93+
# except:
94+
# return None
95+
96+
# if n == 1:
97+
# list_node[-2].next = None
98+
# return list_node[0]
99+
100+
# list_node[-(n+1)].next = list_node[-(n-1)]
101+
102+
# return list_node[0]

0 commit comments

Comments
 (0)