链表问题(2)-----删除

一、题目:在单链表和双链表中删除倒数第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)

猜你喜欢

转载自www.cnblogs.com/Lee-yl/p/9726645.html