当前位置: 首页 > 知识库问答 >
问题:

将单链表更改为双向链表

令狐珂
2023-03-14

我创建了一个单链表函数,我的教授说,为了获得额外的学分,我们可以将其更改为双链表。我读了一些东西,比如添加一个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)

谁能告诉我,(不要为我做这件事),我必须做什么才能把我的链接列表变成一个双重链接列表?我知道我现在必须参考尾巴和头部,但我对如何做到这一点很困惑。

共有2个答案

金飞
2023-03-14

我知道我现在必须参考尾巴和头部,但我对如何做到这一点很困惑。

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

我有一个链表,我需要将其转换为双链表。为此,每个节点都需要跟踪prevnext,而我的列表需要headtail节点。创建列表时,headtail应指向同一项。当我向列表中添加一个新项目时,它应该成为最后一个节点,即它的。prev元素应该是前一个。尾部,它应该是。下一个项目也适用于该项目。

一旦你对你想做的事情有了描述,那么将其翻译成代码应该相对简单。

哈沛
2023-03-14

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

import qualified Data.Vector as V
import Data.Vector (Vector, (!), fromList)

data DLL a = DLL {prevP :: Maybe (DLL a),
                  val :: a,
                  nextP :: Maybe (DLL a)}

list2DLL :: [a]->DLL a
list2DLL = vec2DLL . fromList

prev :: Int -> Maybe Int
prev i | i <= 0 = Nothing
prev i = Just (i-1)

next :: Int -> Int -> Maybe Int
next i lim | i < lim-1 = Just(i+1)
next _ _ = Nothing

vec2DLL :: Vector a -> DLL a
vec2DLL v = scaffold ! 0 where
  scaffold = V.mapWithIndex go v
  go i a = DLL (fmap (scaffold!) $ prev i)
               a
               (fmap (scaffold!) $ next i (length v))
 类似资料:
  • 我目前正在上Java课,教授告诉我们,理解链接的一个好方法是制作双向链表。我做了一个单链表,但是我很难把它转换成双向链表。所以我想知道是否有人能给我任何建议,以确保我的最后一个号码与前一个号码相连?如果前面的数字和最后一个数字连接到null。这是代码的一部分,如果你想得到更多,只要问,我会发布。 用于添加元素等的代码。这是我试图让尾部连接到最后一个数字的尝试。 下面的代码是insert函数,我需要

  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 主要内容:双向链表的创建目前我们所学到的 链表,无论是动态链表还是 静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为 单向链表(或 单链表)。 虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后"

  • 双向链表 结构体 struct   rt_list_node   双向链表节点 更多...   宏定义 #define  rt_container_of(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))   获取type结构体中member成员在这个结构体中的偏移   #de

  • 双向链表 Linux 内核自己实现了双向链表,可以在 include/linux/list.h 找到定义。我们将会从双向链表数据结构开始内核的数据结构。为什么?因为它在内核里使用的很广泛,你只需要在 free-electrons.com 检索一下就知道了。 首先让我们看一下在 include/linux/types.h 里的主结构体: struct list_head { struct l

  • 我目前正在学习数据结构考试,遇到了一个关于迭代的问题。 在单链表上实现双向迭代器是可能的吗?如果是的话,如何实施呢? 我有一个想法,首先向前遍历链表,并存储一个临时链表,该临时链表保存反向的节点。但是遍历这个临时列表将导致一个只允许向后遍历的迭代器。