【问题标题】:trouble implementing a linked list in java在java中实现链表的麻烦
【发布时间】:2020-03-08 11:26:36
【问题描述】:

我尝试使用下面的代码在java中实现一个链表:

    class Linkedlist<T>{

    private node head, tail;

    public Linkedlist(){
        head = new node(null);
        tail = head;
    }

    public boolean insert(T value){
        if(head.getValue() == null){
            this.head.setValue(value);
            head.setNext(null);
            return true;
        }
        node insertNode = new node(value);
        tail.setNext(insertNode);
        tail = insertNode;
        return true;
    }
    public boolean insert(T value, int index)  {

        if ( sizeOfList() == index + 1 ) return false;
        node temp = this.head.getNext();
        node prvtmp = this.head;
        for (int i = 0; i <= index; i++) {
            temp = temp.getNext();
            prvtmp = temp;
            System.out.println("for loop");
        }
        node insertNode = new node(value);
        System.out.println("node created");
        prvtmp.setNext(insertNode);
        insertNode.setNext(temp);
        System.out.println("temps");
        return true;
    }
    public int sizeOfList(){

        int size = 0;
        node temp = this.head;
        while(temp.getNext() != null){
            temp = temp.getNext();
            size++;
        }
        return size;
    }
    public String[] rtrnList(){
        node temp = this.head;
        int listSize = sizeOfList();
        String[] resualt = new String[listSize + 1];
        for (int i = 0;i <= listSize;i++){
            resualt[i] = String.valueOf(temp.getValue());
            temp = temp.getNext();
        }
        return resualt;
    }
}

类节点:

public class node<T> {

    private  T value;
    private node next;

    public node(T value){
        this.value = value;
        this.next = null;
    }
    public void setValue(T value) {
        this.value = value;
    }

    public void setNext(node next) {
        this.next = next;
    }

    public T getValue() {
        return value;
    }

    public node getNext() {
        return next;
    }


}

当我尝试使用一个参数运行 insert 方法时,它工作正常,但是当我使用两个参数运行它时:

import java.util.Arrays;
public class main {
    public static void main(String[] args){
        Linkedlist list = new Linkedlist();
        list.insert(2);
        list.insert(2);
        list.insert(2);
        list.insert(2);
        list.insert(2);
        list.insert(2);
        list.insert(11, 3);

        System.out.println(Arrays.toString(list.rtrnList()));
        System.out.println("finished");
    }
}

程序没有到达打印完成的行,但是如果我们删除该行:list.insert(11, 3); 然后程序就可以正常工作了。

输出:

for loop
for loop
for loop
for loop
node created
finish insert

【问题讨论】:

  • 您的插入方法,如声明的那样,仅接受单个参数,如果您想处理多个参数,则需要其他重写此方法,或使用处理多个参数的不同签名重载它。
  • 我重载插入方法我实际上有 2 个插入。
  • 如果您还可以发布程序的输出,那将会很有帮助。你有很多 System.out.println() 可以帮助追踪错误。
  • 好的,我会编辑帖子

标签: java data-structures singly-linked-list


【解决方案1】:

当您更新 prvtm 和 temp 的值时,问题出在您的 insert(T value, int index) 方法的 for 循环中。在您的代码中,您首先将 temp 的值设置为 temp.getnext() 并且由于 temp 已经更改,将 prvtmp 设置为 temp 创建一个循环,这就是为什么当您尝试打印列表时它在计算时进入无限循环列表的大小。

只需将 prvtmp = temp 行放在 temp = temp.getNext() 之前,就像下面的代码 sn-p 一样。这样就可以解决问题了。

public boolean insert(T value, int index)  { // 2 2 2 2 2 2

    if ( sizeOfList() == index + 1 ) return false;
    node temp = this.head.getNext();
    node prvtmp = this.head;
    for (int i = 0; i <= index; i++) {
        prvtmp = temp;
        temp = temp.getNext();
        System.out.println("for loop");
    }
    node insertNode = new node(value);
    System.out.println("node created");
    prvtmp.setNext(insertNode);
    insertNode.setNext(temp);
    System.out.println("temps");
    return true;
}

此外,如果您尝试在给定索引中插入,请更新 for 循环的条件:

i <= index to i < index - 1

编码愉快!

【讨论】:

    【解决方案2】:

    在插入时有一个循环引用,您可以将此代码用于上述目的

    public boolean insert(T value, int index)  {
    
    
        if(index > sizeOfList())
        {
            return false;
        }
        else if(index == sizeOfList())
        {
            if(insert(value))
                return true;
            else
                return false;
        }
        else
        {
            node previous = this.head;
    
            for (int i = 1; i <= index; i++) {
                if(i==index-1)
                {
                    node newnode = new node(value);
    
                    newnode.setNext(previous.getNext());
                    previous.setNext(newnode);
                    break;
                }
                previous = previous.getNext();
    
            }
        }
    
        return true;
    }
    

    输出

    [2, 2, 11, 2, 2, 2, 2]
    

    【讨论】:

    • 我很欣赏你的编码技巧。这对我帮助很大
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2012-02-04
    • 2017-10-07
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多