【问题标题】:Singly linked list reversal [closed]单链表反转[关闭]
【发布时间】:2020-02-06 04:20:03
【问题描述】:

我猜这个问题是由于我缺乏数据结构知识,但问题是如何反转单链表?我的印象是使用“上一个”字段或属性来解决这个问题会使单链表成为一个双向链表,但是我在网上找到的所有解决方案都涉及使用上一个属性。我在这里错过了什么?

【问题讨论】:

  • 您可以创建一个堆栈,将每个项目按顺序推入堆栈,然后将每个项目从堆栈中弹出。当然,这是假设您知道堆栈是如何工作的。如果这是一个面试问题,那么重点是让你解释你将如何做。如果你不知道,那么你就不知道;在互联网上询问陌生人是作弊:)
  • itsme86 该示例使用“prevnode”不是使其成为双向链表吗?
  • 和 D Stanley,使用堆栈不会作弊,因为它使用单独的数据结构来反转列表?
  • @bman 您的问题中没有任何内容禁止使用单独的数据结构。此外,“prevnode”是一个局部变量,而不是节点元素的属性或字段,不会使其成为双链表。
  • @bman:将栈实现为链表,然后你就不用使用单独的数据结构了。那么,练习一下:你可以将堆栈实现为链表吗?

标签: c# singly-linked-list


【解决方案1】:

鉴于单链表中的典型节点如下所示:

class Node
{
    Node Next {get; set;}
    int Data {get; set;}
}

在尝试反转这些列表时要做的一件有用的事情是想象一下您将如何“手动”完成它。例如,假设你有这个列表:

[head] 9 --> 3 --> 5 --> 1 --> 7 --> [null]

你会想做类似的事情

[null] <-- 9 <-- 3 <-- 5 <-- 1 <-- 7 [head]

如果我们从头到尾遍历列表,我们将从设置为null(代表最后一个节点)的临时“上一个”节点和设置为head的“当前”节点开始,然后简单地捕获变量中当前节点的“下一个”节点(稍后),将当前项目的下一个属性指向“上一个”节点,然后将我们的“上一个”节点设置为当前节点,将当前节点设置为当前节点的原始下一个节点.

换句话说:

Node previous = null;
Node current = head;

while (current != null)
{
    Node next = current.Next;  // capture the next node so we can change it 
    current.Next = previous;   // point this node's next to the previous node
    previous = current;        // update variable for next iteration
    current = next;            // update variable for next iteration
}

head = previous;               // finally we can update the head pointer

【讨论】:

  • 那么,之前的Node不会把这个做成双向链表吧?我的印象是使用以前的节点会。
  • 不,双向链表有一个Node 类,同时具有NextPrevious 属性(此列表中的节点基于顶部的Node 类答案,它只有一个Next 属性)。 Node previous 变量仅用于存储循环中检查的最后一个节点。它也根本不在列表中。
  • 啊,谢谢先生。这就是我感到困惑的原因。
【解决方案2】:

您可以通过遍历它来重建列表。您“弹出”的第一个元素将是结果中的最后一个元素,用伪代码表示

new_list = nothing
while p != nothing:
    next = p.next
    p.next = new_list
    new_list = p
    p = next

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2019-08-13
    • 2019-05-14
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多