aloyme 2019-03-27 16:28 采纳率: 100%
浏览 706
已采纳

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条回答 默认 最新

  • po破小孩 2019-03-27 23:21
    关注

    你在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;
            }
        }
    
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败