【问题标题】:Double Linked List Middle Insert doesn't work双链表中间插入不起作用
【发布时间】:2019-07-23 05:53:33
【问题描述】:
import math
class Node:
    def __init__(self, val, next = None, prev = None):
        self.data = val
        self.next = next
        self.prev = prev

class LinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
        self.count = 0

    def StartInsert(self, val):
        newNode = Node(val)
        if self.count == 0:
            self.head = newNode
            self.tail = newNode
        else:
            self.head.prev = newNode
            newNode.next = self.head
            self.head = newNode
        self.count += 1

    def EndInsert(self, val):
        newNode = Node(val)
        if self.count == 0:
            self.head = newNode
            self.tail = newNode
        else:
            self.tail.next = newNode
            newNode.prev = self.tail
            self.tail = newNode
        self.count += 1

    def MiddleInsert(self, val):
        newNode = Node(val)
        if self.count == 0:
            self.head = newNode
            self.tail = newNode
        else:
            index = math.ceil(self.count/2)-1
            temp = self.head
            while index > 0:
                temp = temp.next
                index -= 1
            temp.next = Node(val, temp.next)
            temp.prev = Node(temp.prev.data, temp)
        self.count +=1


    def delete(self, val):
        curNode = self.head
        while curNode != None:
            if curNode.data == val:
                if curNode.prev != None:
                    curNode.prev.next = curNode.next
                else:
                    self.head = curNode.next

                if curNode.next != None:
                    curNode.next.prev = curNode.prev
                else:
                    self.tail = curNode.prev

                self.count -= 1

            curNode = curNode.next

    def reverse(self):
        temp = None
        current = self.head
        while current != None:
            temp = current.prev
            current.prev = current.next
            current.next = temp
            current = current.prev
        if temp:
            self.head = temp.prev
            self.tail = temp.next



    def traverse(self):
        s = ""
        p = self.head
        while p is not None:
            s += str(p.data) + ' ';
            p = p.next
        print(s + "| count: " + str(self.count))

list = LinkedList()
list.EndInsert("a")
list.StartInsert("b")
list.StartInsert("c")
list.EndInsert("d")
list.MiddleInsert("c")
list.traverse()

list.reverse()
list.traverse()

中间插入给出正确的返回但不会停止。我对单链表做了同样的方法,但它似乎不适用于双链表。它返回正确的值,但一直卡在 while 循环中。

我想弄清楚如何连接 newNode()。请通过显示代码和出现此类错误的原因来帮助我。

非常感谢您的帮助。

【问题讨论】:

    标签: python python-3.x linked-list doubly-linked-list


    【解决方案1】:

    在双向链表中,必须维护 prev 和 next 指针。在MiddleInsert 中,一旦您选择了要在其后添加新节点的元素,您必须在该元素与其跟随者之间插入新元素。

    让我们调用C 新节点,A 选定节点并说B=A.next。在插入之前,您有 A.next == BB.prev == A ;插入后,你想要 A.next == CC.prev == AC.next == BB.prev == C

    只需将其写入MiddleInsert(无关,但此处不需要math 模块,for ... in range(...) 是 Pythonic 循环计数方式):

    def MiddleInsert(self, val):
        newNode = Node(val)
        if self.count == 0:
            self.head = newNode
            self.tail = newNode
        elif self.count == 1:
            self.tail = newNode
            self.head.next = newNode
            newNode.prev = self.head
        else:
            index = (self.count-1) // 2
            temp = self.head
            for i in range(index):
                temp = temp.next
            temp.next.prev = newNode
            newNode.next = temp.next
            newNode.prev = temp
            temp.next = newNode
        self.count +=1
    

    【讨论】:

    • 我不确定在这种情况下中间是最后一个元素是否得到正确处理:temp.next.prev 会引发错误
    • @LouisCaron:你是对的。当列表仅包含一个元素时,我忘记了极端情况。在任何其他情况下,中间元素不能是最后一个。
    【解决方案2】:

    最初的错误是您在MiddleInsert 方法中创建了更多Node

    这会导致您发现代码中的错误。

    删除这些额外的创建后,您应该简单地切换 prev 和 next 指针,检查 temp 实际上不是最后一个元素:

    def MiddleInsert(self, val):
        newNode = Node(val)
        if self.count == 0:
            self.head = newNode
            self.tail = newNode
        else:
            index = math.ceil(self.count/2)-1
            temp = self.head
            while index > 0:
                temp = temp.next
                index -= 1
            newNode.next = temp.next
            temp.next = newNode
            newNode.prev = temp
            if newNode.next is not None:
                newNode.next.prev = newNode
        self.count +=1
    

    【讨论】:

    • 我已将您的代码格式保留得尽可能少,但 Serge Ballesta 的回答是代码重构的好点(如果最后一个元素的问题已解决)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2012-02-18
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多