一、题目:在单链表和双链表中删除倒数第K个节点
分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。
要求:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)
单链表思路:
遍历链表,每移动一步,K-1。如果链表结束,K>0 ,则不存在倒数第K个节点。如果 K == 0,则将链表的头节点删除。如果K<0,则遍历第二遍链表。
import copy class Node: def __init__(self,value): self.value = value self.next = None def delete(head,k): if k < 1 or not head: return head head1 = head while head1: head1 = head1.next k -= 1 if k > 0: return elif k == 0: head = head.next else: head1 = head k += 1 while k != 0: head1 = head1.next k += 1 head1.next = head1.next.next return head head = Node(1) head.next = Node(2) head.next.next = Node(3) head.next.next.next = Node(4) k = 2 delete(head,k)
双链表的思路:
和单链表一样,只是在删除链表节点的地方考虑双链表的 last 指向。
class Node: def __init__(self,value): self.value = value self.last = None self.next = None def delete(head,k): if k < 1 or not head: return head head1 = head while head1: head1 = head1.next k -= 1 if k > 0: return elif k == 0: head = head.next head.last = None else: head1 = head k += 1 while k != 0: head1 = head1.next k += 1 head1.next = head1.next.next if head1.next: head1.next.last = head1 return head head = Node(1) head.next = Node(2) head.last = None head.next.next = Node(3) head.next.last = head head.next.next.next = Node(4) head.next.next.last = head.next head.next.next.next.last = head.next.next k = 2 delete(head,k)