题目
有一个单链表,删除它的倒数第n个节点,尽量只要遍历一次。(保证N是有效值)
思路:
这题的从出题人和我们的想法中,最自然的方法就是用到双指针。快慢两指针,同时指着head,然后快指针先走N步,然后当走到快指针走到None的时候,慢指针走到了倒数第N个节点,刚好可以用来处理。
我的代码:
确定思路后,我便开始着手写代码。思路之外,要考虑几点:
1、快指针先走N步的实现方式;
2、慢指针到了倒数第N个,删除它需要一个previous节点,所以要提前写好这个previous;
3、如果是倒数第n个,n是链表的长度,则写法有需要有所变化。
def delpost(linka,n):
fast=slow=linka.head
times=0
previous=None
while times!=n:
times+=1
fast=fast.next
while fast!=None:
fast=fast.next
previous=slow
slow=slow.next
if previous==None:
linka.head=slow.next
else:
previous.next=slow.next
return linka.head
写完后,我就觉得写的真的是太不简洁了,两个while,一个if else,以及还有times previous这些额外的变量。感觉实现的较为拖沓。
优化
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
Node = ListNode(None)
Node.next = head
first,slow = Node,Node
for i in range(n):
first = first.next
while first.next != None:
first = first.next
slow = slow.next
slow.next = slow.next.next
return Node.next
作者:HUST_PDE_YCX
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/solution/python3-shuang-zhi-zhen-20you-hua-ban-by-huster201/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这是在力扣上看到的,类似于一个优化版简洁版的写法,值得学习。
1、for循环实现先走N步,简洁明了;
2、在head前再加一个Node,这样当N等于链表长度时,也是OK的了;
3、循环到fast.next=None时停止,这样需要删除的就是slow.next了,不需要额外设置一个previous了。
所以后面还是要多思考,多参考别人的写法,改善自己的pytho语言风格。