原始链接列表在Java中反向链接列表时被修改

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原始链接列表在Java中反向链接列表时被修改相关的知识,希望对你有一定的参考价值。

反转链表时原始链表A正在被修改。我将A分配给temp,然后反向执行链表,但仍然对其进行修改。反向后的链表A仅包含单个节点,该节点是原始链表A的头。请帮助查找我到底在哪里做错了。

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     public int val;
 *     public ListNode next;
 *     ListNode(int x) { val = x; next = null; }
 * }

 */
public class Solution {
public int lPalin(ListNode A) {

    ListNode temp = A;

    ListNode prev = null;
    ListNode next = null;
    ListNode B = null;


    while(temp!=null)
    {
        next = temp.next;
        temp.next = prev;
        prev = temp;
        temp = next;
    }

    B = prev;

    ListNode first = A;
    ListNode second = B;

    while(first!=null)
    {
        if(first.val!=second.val)
        return 0;
        first = first.next;
        second = second.next;
    }

    return 1;
}

}
答案

这样做ListNode temp = A;您没有将对象ListNode A限制为temp。您只是将temp变量指向与A相同的存储位置,即使用ListNode的“相同”对象。要克隆对象,您可以使用.clone()

class ListNode implements Cloneable {
  public int val;
  public ListNode next;
  ListNode(int x) { val = x; next = null; }
  public Object clone() throws CloneNotSupportedException { 
    return super.clone(); 
  }
}
// And use to clone
ListNode temp = (ListNode) A.clone();

Reference to use Clone()

另一答案

实际上temp指向A的相同内容,换句话说,您有两个对同一ListNode的引用,您必须通过实现A接口从clonable的内容中复制另一个副本在ListNode中并使用clone方法

另一答案

您的原始列表:[a]->[b]->[c]->...,其中->是下一个元素的参考。

[如前所述,Java对象是通过引用传递的,因此方法参数中的变量A引用内存[a]中的对象(想象对象数据在一个盒子中),因此当您将A分配给[ C0],则分配参考,而不是对象。

与上例中的temp一样,它引用下一个元素,变量->A引用存储单元(一个盒子)temp中的同一对象。[a]A->[a]

关于参考无论如何,参考是什么意思?好吧,简单的类比:想象一下您的内存是一大堆对象。因此引用是某个对象的索引。假设temp->[a]位于索引35353535的内存中,[a]位于索引46464646的情况下。在这种情况下,[b]。并且只要a.next == 46464646(因为它是参考),当A == 35353535变量temp = A之后也是如此。所以temp == 35353535(下一个元素)

以上是关于原始链接列表在Java中反向链接列表时被修改的主要内容,如果未能解决你的问题,请参考以下文章

java 206.反向链接列表(#1递归).java

java 206.反向链接列表(#1递归).java

java 206.反向链接列表(#1递归).java

java 206.反向链接列表(#1递归).java

java 206.反向链接列表(#1递归).java

java 克隆反向单链接列表