java链表添加头节点方法没有用

链表初始化后,再用定义的添加头节点方法没有用。


// 一个类链表里包含类节点

class MyNodeLsit {
    class Node {
        int val;
        Node next;
        Node (int val) {
            this.val = val;
        }
    }
    private Node head;
    private int size;

    public MyNodeLsit () {
        this.head = null;
        this.size = 0;
    }
    // 获得索引的值
    public int getId (int index) {
        if(index >= this.size) {
            return -1;
        }
        Node cur = head;
        while( index-- > 0) {
            cur = cur.next;
        }
        return cur.val;
    }
    // 在第一个添加节点
    public void addPreData (int val) {
        size++;
        Node newHead = new Node(val);
        if (head != null) {
            newHead.next = head;
        }
        head = newHead;
    }

    // 在最后一个添加节点
    public void addLastData (int val) {
        this.size ++;
        Node newNode = new Node(val);
        Node cur = this.head;
        if(cur !=null) {
            while(cur.next != null) {
                cur = cur.next;
            }
            cur.next = newNode;
        }
        else {
            this.head = newNode; 
        }
    }
    // 删除指定的节点
    public void deleteAtindex(int index) {
        if(index >= this.size) {
            return;
        }
        Node cur = this.head;
        while(--index > 0) {
            cur = cur.next;
        }
        // 遍历到要删除的上一个节点处
        cur.next = cur.next.next;
        this.size--;
    }
    // 在指定位置添加指定值
    public void addAtIndex(int index, int val) {
        boolean b = index < 0;
        if (index >= this.size || b) {
            return;
        }
        else if(index == this.size-1) {
            this.addLastData(val);
        }
        else if(index == 0) {
            this.addPreData(val);
        }
        else {
            Node cur = this.head;
            Node newNode = new Node(val);
            while(--index > 0) {
                cur = cur.next;
            }
            newNode.next = cur.next;
            cur.next = newNode;
            this.size++;
        }

    }
    // 初始化链表
    public Node init (int array[]) {
        for(int i = array.length-1 ; i >= 0 ; i--) {
            this.addPreData(array[i]);
        }
        return this.head;
    }
    // 打印链表
    public void print(Node node) {
        if(node == null) {
            return;
        }
        while(node != null) {
            System.out.println(node.val);
            node = node.next;
        }
    }
    // 返回链表的长度
    public int getLength(Node node) {
        int length = 0;
        if(node == null) {
            return -1;
        }
        while(node != null) {
            length++;
            node = node.next;
        }
        return length;
    }
}

public class NodeList {
    public static void main(String args[]) {
        int array[] = {1, 2, 3, 4};
        MyNodeLsit l1 = new MyNodeLsit();
        MyNodeLsit.Node head = l1.init(array);
        // l1.addLastData(9);
        // l1.deleteAtindex(4);
        // l1.addAtIndex(0, 7);
        l1.addPreData(6);
        l1.print(head);
        System.out.println("长度: " + l1.getLength(head));
    }
}

链表初始化用到了添加头结点的方式,再在主函数里添加头结点,不知道为什么添加不了。
都是初始化时候的值

图片说明

图片说明

希望能有大佬帮下忙

1个回答

你在init(array)方法返回的head引用是初始化完的node地址,在addPreData()方法里添加结点是

public void addPreData (int val) {
        size++;
        Node newHead = new Node(val);
        if (head != null) {
            newHead.next = head;
        }
                // 头节点的引用发生了改变
        head = newHead;
    }

但是在主函数的头节点依然是之前初始化完后的节点,只要将print方法修改一下

// 打印链表
    public void print() {
        if(head == null) {
            return;
        }
        while(head != null) {
            System.out.println(head.val);
            head = head.next;
        }
    }

就可以看到你插入的节点了

qq_31713721
aloyme 刚刚看到,十分感谢。原来是print(head)里的head节点是初始化的head节点,并不是添加后的新head节点
7 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

2
双向链表怎么提高插队效率及实现倒排
3
线索二叉树,怎么可能把二叉树变为双向链表呢?
1
c语言 自己写的zz代码不知道怎么连续输入链表每一个节点的数据 求大佬帮忙
4
c语言程序设计-将文件内容赋到一个链表里 然后写一个增加节点的函数 将新增加的节点连到那个链表后面
3
Java该怎么遍历链表数据结构
3
写一个删除链表的倒数第n个节点的问题能通过,但是提交答案显示出错
3
python 双链表 头部插入元素问题
1
关于链表添加值的问题?
2
不带头结点单链表逆置总是不能正确地改变原链表?
1
题目是删除链表的倒数第N个节点
2
MFC 数据链表取随机数
1
输入若干个正整数(输入-1为结束标志),建立一个单向链表,将其中的偶数值结点删除后输出。
1
C++在链表递归的过程中使用临时节点并且置NULL,那么二叉树需要吗?
1
红黑树最坏情况为何不是退变为链表的情况?
2
C语言链表插入问题 插入节点到头节点之前去 遍历后发现只能显示插入的那个节点。
2
为什么用while循环至链表某尾时程序不再运行?
0
用python实现双向循环链表的问题
4
问一个很愚蠢的基础问题,p=p->next链表循环里,为什么这样不会覆盖掉链表的值啊
1
c语言,为什么用fread 读入文件 链表 每次都会多一个节点?
1
单链表的一些操作,没有输出。不知道哪里错了!!!求大哥帮忙!