繁体   English   中英

链表如何工作?

[英]How the linked list works?

我没有计算机科学背景。 我正在尝试自己学习编码,而部分是通过解决LeetCode上的问题来实现的。
无论如何,还是存在使用链表的问题。 而且我已经发现必须在Phython中模拟链接列表的信息。 我的问题是,我真的无法获得链表背后的内容。 例如,这些问题应该针对哪些问题?
以及链表的一般功能。 此类信息的任何链接将非常有帮助。
我在LeetCode上看到的最近的问题要求交换每两个相邻的节点并返回其头。 LeetCode提供了以下解决方案,我实际上无法弄清楚它的实际工作方式。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        pre = self
        pre.next = head
        while pre.next and pre.next.next:
           a = pre.next
           b = a.next
           pre.next =b
           b.next =a 
           a.next =b.next
           pre = a
        return self.next

如我所说,我不理解这种解决方案。 我尝试使用示例列表1-> 2-> 3-> 4应该返回列表2-> 1-> 4-> 3的例子,我所管理的只是使一个循环通过,然后计算机应该退出循环,然后会发生什么呢? 后两个数字如何转换? 如果list仅包含2个元素,此代码将如何工作,在我看来,这是不可能的。

如果您能将我引向可以解释此类内容的在线文献,我将不胜感激。

谢谢。

链表的作用与数组几乎相同。 虽然有一些主要区别。 在链接列表中,使用的内存不是(而且几乎永远不会)是连续内存。 因此,在数组中,如果u有5个项目,并且您查看内存,则所有5个项目将彼此紧挨着(大部分情况下)。 但是,链表中的每个“项目”都有一个直接指向下一个项目的指针,从而消除了具有连续内存的需要。 因此,数组是在内存中连续存在的项的“列表”,而链表是对象的“列表”,每个对象都包含一个项和指向下一个项的指针。 这被视为单个链表,因为只能从一个方向进行遍历。 还有一个双重链接列表,其中每个节点现在都有一个指向下一个节点的指针,而另一个指向前一个节点的指针允许从两个方向遍历。

https://www.cs.cmu.edu/~adamchik/15-121/lectures/Linked%20Lists/linked%20lists.html

该链接将帮助您熟悉可视化这些链接列表的工作方式。 我可能会专注于插入前后,因为它们应该可以帮助您了解循环的作用。

链接列表在Python中不“存在”,因为该语言基本上具有可迭代的内置列表对象。 在后台,我确定这是作为C代码中的链接列表实现的(Python的最常见实现)。

主要特征是链表很容易扩展,如果要扩展它,则必须手动调整数组的大小。 同样,在Python中,所有这些细节都被抽象掉了。 因此,我认为尝试在Python中使用链接列表的示例是没有意义的,因为您不会学到任何东西。

您应该在C中执行此操作,以实际了解内存分配和指针。

也就是说,在您的示例中,每个ListNode都包含一个值(如数组),但不仅如此,它还有一个变量“ next”,您可以在其中存储另一个ListNode对象。 与第一个对象一样,该对象具有一个值和一个存储另一个ListNode对象的变量,该对象可以根据需要继续为多个对象。

代码的工作方式是,当我们说pre.next时,它指的是存储在此处的ListNode对象,其后的下一个对象是pre.next.next。 这是可行的,因为pre.next是一个ListNode对象,它的下一个变量。

同样,请阅读C中的链表。如果您打算使用高级语言,我会说您真的不需要了解链表,因为这些数据结构对于大多数高级语言都是“免费的”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM