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节点
一年多之前 回复
立即提问