【问题标题】:Why do I need to make 'head' equal to 'prev' to finish reversing a Linked List?为什么我需要使'head'等于'previous'才能完成反向链接列表?
【发布时间】:2021-12-05 06:12:38
【问题描述】:

抱歉,问题标题很尴尬。如果没有代码示例,我真的不知道如何解释。我已经使用泛型实现了一个链接列表,我正在尝试反转它。

public Node<T> reverse() {
Node<T> prev = null;

while (head != null) {
  Node<T> next = head.next;
  head.next = prev;
  prev = head;
  head = next;
  System.out.println("head: " + head.next + "\nprev: " + prev.next);
}
head = prev;
return prev;
}

head = prev;

我的问题是,为什么需要这样做?

我的 LinkedList 输出: [输出]

但如果没有head = prev; 行,它只会输出空白 []。这与泛型有关吗?

【问题讨论】:

    标签: data-structures linked-list


    【解决方案1】:

    不是,和generics没有关系,看你的reverse方法,一开始有三个节点prev指向null,head指向链表的开头,next指向到head 的下一个节点。在每一步中,您都在向前移动每个节点,直到它被反转,所以完成后,您的 prev 节点将指向链表的尾部,这实际上是反向链表的开始,@987654329 @ 和 next 指向空值。所以需要head = prev来让head指向反向链表的起始节点。

    【讨论】:

    • 嗨。感谢您抽出时间回复。我的主要问题是,如果我不将它包含在这个版本中,我似乎没有这个问题:leetcode.com/submissions/detail/597095512 为什么上面的版本可以工作,而我的不行?请记住,我特指省略了 thre 'head = prev' 部分。在我看来,它们完全相同。如果我在 return 之前不包含该行。
    • 链接失效
    • 哎呀!试试这个:pastebin.com/HxPJ4KgR
    • 在这个版本中,返回的值是一个正确的节点,即prev,在您的版本中,返回的节点也是prev,这是正确的,但head节点是全局的。因此,您需要分配head = prevhead = reverse()
    • 啊,所以它本质上是一个范围界定问题?即,如果我要在参数括号内创建“节点头”,它会修复它吗?这是有道理的,因为我实际上是故意将其删除,因为我只是想将其称为“list.reverse()”。
    【解决方案2】:

    *TLDR;因为在 while 循环结束时,'head' 指向 null,而不是反向列表。

    --

    让我们通过一个例子来理解你的代码: 列表:3 -> 6 -> 9 -> 空 头指向3。 // 1

    Node<T> prev = null;
    while(head != null) // true
    Node<T> next = head.next; // next -> 6, as head.next points to Node with element 6
    head.next = prev; // head->next = null, earlier it pointed to Node with element 6, prev is null
    prev = head; 
    head = next;
    

    当前状态:

    null <- 3 6 -> 9 -> null
    Now, prev points to 3, head points to 6.
    // 2
    while(head != null) // true
    Node<T> next = head.next; // next -> 9, as head.next points to Node with element 9
    head.next = prev; // head->next =3, earlier it pointed to Node with element 9, prev is 3
    prev = head; 
    head = next;
    

    当前状态:

    null <- 3 <- 6 9 -> null
    Now, prev points to 6, head points to 9.    
    
    // 3
    while(head != null) // true
        Node<T> next = head.next; // next -> null, as head.next points to null
        head.next = prev; // head->next =6, earlier it pointed to null, prev is 6
        prev = head; 
        head = next;
    

    当前状态:

    null <- 3 <- 6 <- 9
    Now, prev points to 9, head points to null.
    
    // 4
    while(head != null) // false
    
    Now, head points to null and you need to return reversed linked list.
    head = prev; // prev points to the node with element 9.
    // null <- 3 <- 6 <- 9 <- prev (or head) as head and prev are equal.
    return prev; // will return the reversed linked list.
    return head; // will return the reversed linked list as both prev and head are equal.
    

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2010-12-31
      • 1970-01-01
      • 2016-12-11
      • 2013-02-06
      相关资源
      最近更新 更多