原始链接列表在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();
实际上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中反向链接列表时被修改的主要内容,如果未能解决你的问题,请参考以下文章