链表如何工作?

时间:2017-01-20 19:52:52

标签: python linked-list computer-science

我没有计算机科学背景。我正在尝试自己学习编码,而我正在通过解决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个元素,那么这段代码是如何工作的,对我来说似乎是不可能的。

如果你能指导我解释这样的在线文学,我将非常感激。

感谢。

2 个答案:

答案 0 :(得分:1)

链表与数组几乎相同。但是有一些主要的区别。在链表中,使用的内存不是(并且几乎从不是)连续内存。所以在一个数组中,如果你有5个项目并且你看看内存,那么所有5个项目将彼此相邻(大多数情况下)。然而,每个项目'在链表中有一个指针直接指向下一个项目,无需连续内存。所以数组是一个列表'在内存和链表中连续存在的项目是一个列表'每个持有一个项目的对象和一个指向下一个项目的指针。这被认为是单个链表,因为遍历只能从一个方向进行。还有一个双链表,其中每个节点现在都有一个指向下一个节点的指针和另一个指向前一个节点的指针,允许从两个方向进行遍历。

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

该链接将帮助您熟悉可视化这些链接列表的工作方式。我可能会专注于插入之前和之后,因为它们可以帮助您理解循环正在做什么。

答案 1 :(得分:1)

链接列表不存在"存在"在Python中,语言基本上有一个可迭代的内置列表对象。在引擎盖下,我确信这是作为C代码中的链表实现的(Python的最常见实现)。

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

你应该在C中这样做,以实际了解内存分配和指针。

那就是说,给出你的例子,每个ListNode都包含一个值(就像一个数组),但不仅如此,它还有一个变量' next'您存储另一个ListNode对象的位置。与第一个对象一样,此对象具有一个值,以及一个存储另一个ListNode对象的变量。这可以根据需要继续使用多个对象。

代码的工作方式是当我们说pre.next时,这指的是存储在那里的ListNode对象,之后的下一个对象是pre.next.next。这是有效的,因为pre.next是一个ListNode对象,它有一个变量next。

再次,阅读C中的链接列表。如果您打算使用更高级别的语言,我会说您并不需要理解链接列表,因为这些数据结构来自"免费& #34;使用大多数高级语言。