Remove Nth Node From End of List
题目的要求是尽量One pass解决,首先想到的方法还是利用stack收入所有点后反向弹出来,这样不能算one pass,也算是一种方法吧,下面是代码,链表型题就是注意空节点问题就好了
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
stack = []
cur = head
while cur:
stack.append(cur)
cur = cur.next
count = 0
remove_node = None
while count < n:
remove_node = stack.pop()
count += 1
if remove_node == head:
return head.next
else:
stack[-1].next = remove_node.next
remove_node.next = None
return head
下面是one pass的方法,利用的就是链表里常用的快慢指针技巧,即令快指针先往前挪n位再同时移动快慢指针知道快指针到头,这时慢指针就在需要删除的结点前一位,删除即可,另外这里注意一下dummy node的创建还有快慢指针的初始化以及快指针应该移动的位数
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
dummy = ListNode('dmu')
dummy.next = head
slow, fast = dummy, head
for i in xrange(n):
fast = fast.next
while fast:
fast = fast.next
slow = slow.next
tmp = slow.next
slow.next = tmp.next
tmp.next = None
return dummy.next