zoukankan      html  css  js  c++  java
  • java自定义链表数据结构

     链表是一种数据结构:由数据和指针构成,链表的指针指向下一个节点。

    listnode是自定义的一种链表结构,下面为链表的添加、遍历和替换的代码实现。初学有点难理解,多看几遍就会了。

    class ListNode {        //类名 :Java类就是一种自定义的数据结构
        int val;            //数据 :节点数据 
        ListNode next;      //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似
        
        ListNode(int val){  //构造方法 :构造方法和类名相同   
            this.val=val;   //把接收的参数赋值给当前类的val变量
        }
    }
    
    class Test{
        public static void main(String[] args){
            
            ListNode nodeSta = new ListNode(0);          //创建首节点
            ListNode nextNode;                           //声明一个变量用来在移动过程中指向当前节点
            nextNode=nodeSta;                            //指向首节点
            
            //创建链表
            for(int i=1;i<10;i++){
                ListNode node = new ListNode(i);         //生成新的节点
                nextNode.next=node;                      //把心节点连起来
                nextNode=nextNode.next;                  //当前节点往后移动
            } //当for循环完成之后 nextNode指向最后一个节点,
            
            nextNode=nodeSta;                            //重新赋值让它指向首节点
            print(nextNode);                             //打印输出
         
            //替换节点
            while(nextNode!=null){
                if(nextNode.val==4){
                    ListNode newnode = new ListNode(99);  //生成新的节点
                    ListNode node=nextNode.next.next;     //先保存要替换节点的下一个节点
                    nextNode.next.next=null;              //被替换节点 指向为空 ,等待java垃圾回收
                    nextNode.next=newnode;                //插入新节点
                    newnode.next=node;                    //新节点的下一个节点指向 之前保存的节点
                }
                nextNode=nextNode.next;
            }//循环完成之后 nextNode指向最后一个节点
             nextNode=nodeSta;                            //重新赋值让它指向首节点
             print(nextNode);                             //打印输出
          
        }
        
        //打印输出方法
        static void print(ListNode listNoed){
            //创建链表节点
            while(listNoed!=null){
                System.out.println("节点:"+listNoed.val);
                listNoed=listNoed.next;
            }
            System.out.println();
        }
    }

    需要理解jvm内存模型,在这里nextNode只是一个变量!!!类型为ListNode。

    ListNode nextNode;//声明一个变量nextNode,为null值。相当于ListNode nextNode = null;
    ListNode nodeSta = new ListNode(0); 
    可以分解为:
      ListNode nodeSta;//声明一个变量nodeSta
      nodeSta = new ListNode(0);//堆中创建对象(分配一段内存空间),并且把变量nodeSta指向了堆中的对象
    变量都是在栈中的;


     链表是一种数据结构:由数据和指针构成,链表的指针指向下一个节点。
    所以链表结构是一个对象,在堆内存中有一块空间存储。链表的变量next指向着下一块
    堆内存的空间存储位置。

  • 相关阅读:
    20200902
    20200808
    20200801
    20191017
    LeetCode #974. Subarray Sums Divisible by K 数组
    LeetCode #532. K-diff Pairs in an Array 数组 哈希 双指针
    LeetCode #234. Palindrome Linked List 链表 栈 链表逆置
    LeetCode #307. Range Sum Query
    LeetCode #45. Jump Game II 数组 贪心
    LeetCode #55. Jump Game 数组 贪心 线性DP 回溯
  • 原文地址:https://www.cnblogs.com/chenfx/p/14288066.html
Copyright © 2011-2022 走看看