当前位置: 首页 > 知识库问答 >
问题:

Head.Next如何在单个linkedlist中更改

干善
2023-03-14

我对简单的单链表有很大的困惑,比如:在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中更改?

共有1个答案

颛孙晗昱
2023-03-14

Head.Next如何在单独的linkedlist中更改?

简而言之:因为最初firstlast都指向同一个节点,所以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设计(内存效率),对象分配只复制地址值,而不是克隆整个节点值(在现实世界中,它可能很大)。

firstlast现在保存与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. https://softwareengineering.stackexchange.com/questions/207196/do-pointers-realy-exist-in-java
  2. https://softwareengineering.stackexchange.com/questions/141834/how-is-a-java-reference-different-from-a-c-pointer

步骤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: 它应该是可选的,因为您不能选择任何单元格。接下来让我们声明选定状态和未选定状态的高度(将值更改为所需的值): 现在您必须实现: 现在,在您的方法中,您必须检查是否选中了选定行或未选定行: 该和电话是给你一个动画的高