自己解法(长度)
- 首先获取链表长度l;
- 寻找链表长度l与倒数第n个节点中n的关系;
- index=l-n;
- 删除index位置节点即可。
细节:
- 长度为0的时候直接返回head(空链表);
- index=0的时候,相当于删除头节点。
class Solution(object):
def length(self,head):
cur=head
count=0
while cur:
count+=1
cur=cur.next
return count
def removeNthFromEnd(self, head, n):
l=self.length(head)
if l==1:
return None
index=l-n
if index==0:
return head.next
prev=head
for _ in range(index-1):
prev=prev.next
prev.next=prev.next.next
return head
栈
“先进后出”
弹出栈的第 n个节点就是需要删除的节点,且当前栈顶的节点就是该删除节点的前驱节点。
class Solution(object):
def removeNthFromEnd(self, head, n):
cur = head
stack=list()
while cur:
stack.append(cur)
cur=cur.next
for i in range(n):
stack.pop()
#已经删除n个元素,目前stack的最后一个元素就是待删除节点的前一个节点
if stack==[]:
return head.next
prev=stack[-1]
prev.next=prev.next.next
return head
注意:为什么题解中令dummy=ListNode(0,head)就不用考虑特殊情况呢?何时应该使用呢?
哑节点:完美解决一旦头结点被删除无法返回元素的问题。
双指针法
- 快慢指针从头节点出发;
- 快指针先行n步;
- 快指针到达末尾,慢指针到达n。
class Solution(object):
def removeNthFromEnd(self, head, n):
dummy=ListNode(0,head)
slow,fast=dummy,head
for _ in range(n):
fast=fast.next
while fast:
fast=fast.next
slow=slow.next
slow.next=slow.next.next
return dummy.next