Python 将单链接列表更改为双链接列表

Python 将单链接列表更改为双链接列表,python,data-structures,singly-linked-list,doubly-linked-list,Python,Data Structures,Singly Linked List,Doubly Linked List,我创建了一个单链表函数,我的教授说,为了获得额外的学分,我们可以将其更改为双链表。我读了一些东西,比如添加一个prev_节点函数,比如这样 class ListNode(object): def __init__(self, item = None, prev = None, link = None): '''creates a ListNode with the specified data value and link post: creates

我创建了一个单链表函数,我的教授说,为了获得额外的学分,我们可以将其更改为双链表。我读了一些东西,比如添加一个prev_节点函数,比如这样

class ListNode(object):

    def __init__(self, item = None, prev = None, link = None):

        '''creates a ListNode with the specified data value and link
        post: creates a ListNode with the specified data value and link'''

        self.item = item
        self.prev = prev
        self.link = link
然而,我不知道从那里去哪里。我知道我需要像这里一样加上一个尾巴和一个脑袋

from DoublyListNode import ListNode

class LinkedList(object):

    #--------------------------------------------------------------

    def __init__(self, seq=()):

        """ Pre: Creates a Linked List
        Post: Creates a list containing the items in the seq=()"""

        if seq == ():

            # If there is no items to be put into the list, then it creates an empty one.
            self.head = None
            self.tail = None

        else:

            # Creates a node for the first item.
            self.head = ListNode(seq[0], None)

            # If there are remaining items, then they're added while keeping track of the last node.
            last = self.head
            for item in seq[1:]:
                last.link = ListNode(item, None)
                last = last.link

        self.size = len(seq)

有谁能告诉我(不是为我这么做),我必须做些什么才能把我的linkedlist变成双linkedlist?我知道我现在必须引用头部和尾部,但我对如何做感到非常困惑。

我不懂Python,但在Haskell中有一种方法可以做到这一点:

导入限定数据。向量为V
导入数据.Vector(Vector,(!),fromList)
数据DLL a=DLL{prevP::Maybe(DLL a),
瓦尔:a,
nextP::Maybe(DLL a)}
list2DLL::[a]->DLL a
list2DLL=vec2DLL。fromList
prev::Int->Maybe Int
上一个i | i Int->可能Int
下一个i lim | iDLL a
vec2DLL v=脚手架!0在哪里
脚手架=V.mapWithIndex go V
go i a=DLL(fmap(脚手架!)$prev i)
A.
(fmap(脚手架!)$next i(长度v))
我知道我现在必须参考头部和尾部,但我很困惑如何做到这一点

一个开始的好方法是用英语写下你想做什么:

我有一个链表,我需要将其转换为双链表。为此,每个节点都需要跟踪
prev
next
,而我的列表需要
head
tail
节点。创建列表时,
head
tail
应指向同一项。当我向列表中添加一个新项目时,它应该成为最后一个节点,它的
.prev
元素应该是前一个
.tail
,它也应该是该项目的
.next
项目


一旦你对你想做的事情有了一个描述,那么把它翻译成代码就相对简单了。

任何时候你在
tail
中附加一个新节点时,用新节点替换
tail
。任何时候插入到位置0时,用新节点替换
头部
。任何时候删除
tail
,都要用tail节点的
prev
替换
tail
。任何时候删除
head
,都要将
head
替换为head节点的
next
。请注意,单链接或双链接实际上不会改变链接列表的任何行为。它只是改变了你可以迭代的方式;在单链接列表中,只能从head->tail进行迭代,在双链接列表中,可以在任意方向进行迭代。从技术上讲,在这两种情况下,存储
tail
;它使添加到列表的速度更快(尽管在单链接列表中保持
tail
最新比较困难,因为您无法从旧的
tail
中找到新的
tail,您必须迭代整个列表)。肯定有一个python双链接列表。寻找这个可能会给你一些想法。