题目:删除链表的倒数第N个结点
思路:
1.若链表为空,或者k<0, 则返回原链表。
2.两个指针p,q,先让指针p往前走n步,这样就保持p,q指针相差n个数。。
3.此时p与q一起各往前一步一步走,当p指向空时,q指向倒数第n个结点。
注意点:判断指针p的状态的临界点
- 当p为None时,t<n,不用删除,返回原链表.
- 当p为None时,t=n, 删除第一个结点。
- 当p.next为空时,删除的时链表的中间结点。
"===============================题目解答=============================="
def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
# 链表为空,或者n<0
if not head or n <=0:
return head
# 2个移动的指针
p = q = head
# p指针先走n步,q指针再走,这样两个始终相差n步
t = 0
while p !=None and t < n:
p = p.next
t = t+1
# 链表的长度小于n,不用删除,返回原链表
if t < n:
return head
# 当n == 链表的长度时,即删除(倒数第n个节点==第1个节点)
if p == None:
return head.next
# p指针走到末尾了,q指针就指向倒数第n个节点
while p.next != None:
p = p.next
q = q.next
tmp = q.next
q.next = tmp.next
return head
if __name__ == "__main__":
# ListNode_handle的实现在《2个数相加》那篇文章,此处不再写
aa = ListNode_handle()
l1_lsit = [5,4,3,2,1]
aa.add(l1_lsit)
l1= aa.cur_node
aa.print_ListNode(removeNthFromEnd(l1,2))