# -*- coding:utf-8 -*-"""
Author: leadingme
Mail:[email protected]
MyWebsite:leadingme.top
"""# 删除链表的倒数第n个节点"""
算法要求: 给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点(不带头结点)
示例:
给定一个链表 1->2->3->4->5, n=2
当删除倒数第二个节点后,链表变为1->2->3->5
"""defremoveNthFromEnd(head, n):"""
:param head:
:param n:
:return:
"""
pointer = head
length =0while pointer:# 求出链表的长度(包含头结点)
pointer = pointer.next
length +=1if length ==1:# 链表为空returnNone
pointer = head
if n >= length:# 删除的节点为第一个节点, 删除头节点
head.next= head.next.nextelse:if n ==1:# 删除的节点为最后一个节点, 删除尾节点for i inrange(length-2):
pointer = pointer.next
pointer.next=Noneelse:# 删除的节点为中间某个节点for i inrange(length-n-1):
pointer = pointer.next
pointer.next= pointer.next.nextreturn head
进阶方法:
defremoveNthFromEnd2(head, n):"""
:param head:
:param n:
:return:
"""if head isNone:# 如果链表为空,则返回NonereturnNone
left = right = head
si =0while si < n:
si +=1
right = right.nextif right isNone:# right为None,right移动到尾节点, 删除第一个节点
head= head.nextreturn head
while right.nextisnotNone:
left = left.next
right = right.nextif n ==1:# 删除最后一个节点
left.next=Noneelse:
left.next= left.next.nextreturn head