Python 将单链接列表更改为双链接列表
我创建了一个单链表函数,我的教授说,为了获得额外的学分,我们可以将其更改为双链表。我读了一些东西,比如添加一个prev_节点函数,比如这样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
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双链接列表。寻找这个可能会给你一些想法。