我对简单的单链表有很大的困惑,比如:在Java中。
节点类:
public class node {
public int data;
public node next;
public node(int data , node next) {
this.data = data;
this.next = next;
}
}
链表类:
public linked list{
public node first;
public node last;
public void add(int data){
node x = new node(data,null);
if( first == null ) { first= x; }
else { last.next = x; }
last = x;
}
}
这里有一个很大的混乱,如果链表是空的,并且我试图添加新节点例如:add(1);
第一个节点的数据为1,第一个节点的下一个为空,最后一个节点的数据为1,最后一个节点的下一个为空
现在,如果我添加了一个新节点,例如:add(2);
最后一个节点的数据将是2,最后一个节点的下一个将是null,第一个节点的数据仍然是1,但第一个节点的下一个将是tail,这是如何发生的?
Head.Next如何在单独的linkedlist中更改?
Head.Next如何在单独的linkedlist中更改?
简而言之:因为最初first
和last
都指向同一个节点,所以last.next=x
间接导致first.next=x
。
长答:
它的核心是对象引用(指针)。
1.内存分配:
语句分配新的内存来保存节点值(data&next)。x
现在保留地址值,即0x1ACD
为实际节点值。换句话说,x
是一个节点指针。
node x = new node(data,null); //0x1ACD
2.指针取消引用:
为了访问实际的节点值,我们需要取消引用地址值。当您访问Object(即node.next
)中的属性时,会发生指针解引用。下面的语句取消引用last
,而html" target="_blank">对象赋值将x
中的地址值复制到next
(last
中的属性)。
last.next = x;
3.对象分配:
由于内部Java设计(内存效率),对象分配只复制地址值,而不是克隆整个节点值(在现实世界中,它可能很大)。
first
和last
现在保存与x
相同的地址值,即对实际节点值的地址。
public void add(int data){
...
first = x;
last = x;
...
}
你可能会问这有什么好?好吧,举下面的例子:
public void add(int data){
...
first = x;
last = x;
last.next = new node(123,null);
...
}
注意,last.next==first.next
。通过last
更改节点值也会修改first
,因为两者都指向相同的节点值。
这就是Head.Next如何在单独的linkedlist中更改的完整答案?
参考资料:
步骤1:当我们将(1)
添加到空列表时:
public void add(int data) {
...
first= x;
...
last = x;
...
}
// after:
[1] <- first, last // first and last now pointing to the same `node:x`.
|
[/] <- first.next, last.next // first.next, last.next pointing to null.
步骤2:现在,当我们将(2)
添加到前面的列表(非空)时:
// before:
[1] <- first, last
|
[/] <- first.next, last.next // first.next, last.next pointing to null.
public void add(int data) {
...
// technically, since first and last pointing to the same node[1],
// x actually being assigned to both first.next and last.next.
last.next= x;
...
last = x; // update last from previous-x to current-x.
...
}
// after:
[1] <- first
|
[2] <- last // first.next, last is pointing to the new `node:x`.
|
[/] <- last.next // last.next to null.
步骤3等等:现在,让我们向列表添加(3)
或后续值(非空):
// before:
[1] <- first
|
[2] <- last
|
[/] <- last.next // last.next to null.
public void add(int data) {
...
last.next= x; // access previous-x and assign x to previous-x's next.
...
last = x; // update last from previous-x to current-x.
...
}
// after:
[1] <- first
|
[2]
|
[3] <- last // last is pointing to the new `node:x`.
|
[/] <- last.next // last.next to null.
>
first
始终指向列表中的第一个节点。
last
始终指向列表中的最后一个节点。
last.next
总是指向null。通过add()
,总是通过赋值到last.next
将一个新节点追加到列表末尾。
本文向大家介绍如何实现Java中一个简单的LinkedList,包括了如何实现Java中一个简单的LinkedList的使用技巧和注意事项,需要的朋友参考一下 LinkedList与ArrayList都是List接口的具体实现类。LinkedList与ArrayList在功能上也是大体一致,但是因为两者具体的实现方式不一致,所以在进行一些相同操作的时候,其效率也是有差别的。 对于抽象的数据结构——
我想做一个应用程序,以一种简单的方式在电影院分配座位。 我有一个LinkedList,其中随机填写了0“座位可用”或1“座位已被占用”。此LinkedList由变量int“seatsTotal”生成,然后用数学填充LinkedList。具有1或0的随机函数。 这个想法是用户给出一个变量,即他们想预订多少座位,之后,一个(也许是递归的)方法将查找(例如)标有0(可用)的5个座位。 如果后面(旁边)没
我试图解决以下问题algo专家级: 编写一个函数,该函数接收一个单向链接列表的头部和一个整数,按位置移动列表(即,不创建一个全新的列表),并返回其新头部。 移动链接列表意味着向前或向后移动其节点,并在适当的情况下将其环绕在列表中。例如,将链表向前移动一个位置将使其尾部成为链表的新头部。 节点向前还是向后移动取决于是正还是负。 每个节点都有一个整数,还有一个节点,指向列表中的下一个节点,或者如果是列
这里的问题是什么?。我正在尝试实现图数据结构,使用邻接列表,通过使用来自util包的集合。这里 包含一些整数的LinkedList数组。LinkedList的每个元素都包含另一个类型为:node的LinkedList。 但在编译过程中,它表示不兼容类型。如何解决这个问题?
我有两份清单: 我想要一个新的名单,比如: 我尝试了以下方法: 但有一些严重的错误
问题内容: 单击时,我必须调整tableView的一行的大小。我该怎么做?有人可以帮助我吗? 我的视图控制器类: 问题答案: 首先,您必须跟踪属性中当前选定单元格的indexPath: 它应该是可选的,因为您不能选择任何单元格。接下来让我们声明选定状态和未选定状态的高度(将值更改为所需的值): 现在您必须实现: 现在,在您的方法中,您必须检查是否选中了选定行或未选定行: 该和电话是给你一个动画的高