• 数据结构(二)之链表


    1.单链表

    package cn.liusong.Array;
    
    public class Node {
        int data;
        Node next;
    
        public Node(int data) {
            this.data = data;
        }
    
        //为节点追加节点
        public Node append(Node node) {
            //当前节点
            Node currentNode = this;
            //循环向后找
            while (true) {
                //取出下一个节点
                Node nextNode = currentNode.next;
                //如果下一个节点为null,当前节点为最后的节点
                if (nextNode == null) {
                    break;
                }
                //赋给当前节点
                currentNode = nextNode;
            }
            //把需要追加的节点到当前找到的节点的下一个节点
            currentNode.next = node;
            return this;
        }
    
        public Node next() {
            return this.next;
        }
    
        public void show() {
            Node currentNode = this;
            while (true) {
                System.out.print(currentNode.data + "->");
                Node newNext = currentNode.next;
                currentNode = newNext;
                if (currentNode == null) {
                    System.out.print("null");
                    System.out.println(" ");
                    break;
                }
            }
        }
    
        //删除节点
        public void removeNext() {
            //  取出下下一个节点信息
            Node newNext = next.next;
            //把下下一个节点的信息给当前节点
            next = newNext;
        }
    
        //取出节点数据
        public int getData() {
            return this.data;
        }
    
        //插入一个新节点
        public void after(Node node) {
            //取出下一个节点作为下下一个节点
            Node nextNext = next;
            //插入新的节点作为下一个节点
            this.next = node;
            //取出下下一个节点连在下一个节点之后
            node.next = nextNext;
        }
    }
    

      测试链表功能

    package cn.liusong.Array;
    
    public class TestNode {
        public static void main(String [] args){
            //创建节点
            Node n1 = new Node(1) ;
            Node n2 = new Node(2) ;
            Node n3 = new Node(3) ;
            Node n4 = new Node(4) ;
            Node n5 = new Node(5) ;
            //追加节点
            n1.append(n2).append(n3).append(n4);
            //显示节点链
            n1.show() ;
            //取出节点
          // System.out.println(n1.next().next().getData());
            n1.next.removeNext();
            n1.show();
            n1.after(n5);
            n1.show();
        }
    }

    测试结果

    2.双链表

    package cn.liusong.Array;
    
    public class DoubleNode {
        DoubleNode pre = this ;
        DoubleNode next = this ;
        int data ;
    
        public DoubleNode(int data){
            this.data = data ;
        }
    
        //增加一个节点
        public void after(DoubleNode node){
            //当前节点的下一个节点作为下下一个节点
            DoubleNode nextNext = next ;
            //把新的节点作为当前节点的下一个节点
            this.next = node ;
            //把当前节点作为新节点的前一个节点
            node.pre = this ;
            //把下下一个节点作为新节点的后一个节点
            node.next = nextNext ;
            //让原来的下一个节点作为上一个节点的新节点
            nextNext.pre = node ;
        }
    
        //下一个节点
        public DoubleNode getNext(){
            return this.next;
        }
        //获取上一个节点
        public DoubleNode getPre(){
            return this.pre ;
        }
        //获取数据
        public int getData(){
            return  this.data ;
        }
    }

    测试双链表

    package cn.liusong.Array;
    
    public class TestDoubleNode {
        public static void main(String[] args){
            DoubleNode n1 = new DoubleNode(1) ;
            DoubleNode n2 = new DoubleNode(2) ;
            DoubleNode n3 = new DoubleNode(3) ;
            //追加节点
            n1.after(n2);
            n2.after(n3);
            //查看上一个,下一个和自己节点的内容
            System.out.println(n2.pre.getData());
            System.out.println(n2.getData());
            System.out.println(n2.next.getData());
            System.out.println(n3.next.getData());
            System.out.println(n1.pre.getData());
        }
    }

    结果

    循环链表

    package cn.liusong.Array;
    
    public class LoopNode {
        int data;
        LoopNode next = this;
    
        public LoopNode(int data) {
            this.data = data;
        }
    
        //删除节点
        public void removeNext() {
            //  取出下下一个节点信息
            LoopNode newNext = next.next;
            //把下下一个节点的信息给当前节点
            next = newNext;
        }
    
        //取出节点数据
        public int getData() {
            return this.data;
        }
    
        //插入一个新节点
        public void after(LoopNode node) {
            //取出下一个节点作为下下一个节点
            LoopNode nextNext = next;
            //插入新的节点作为下一个节点
            this.next = node;
            //取出下下一个节点连在下一个节点之后
            node.next = nextNext;
        }
    }

    测试循环链表

    package cn.liusong.Array;
    
    public class TestLoopNode {
        public static void main(String[] args){
            LoopNode n1 = new LoopNode(1) ;
            LoopNode n2 = new LoopNode(2) ;
            LoopNode n3 = new LoopNode(3) ;
            LoopNode n4 = new LoopNode(4) ;
            LoopNode n5 = new LoopNode(5) ;
            n1.after(n2);
            n2.after(n3);
            n3.after(n4);
            n4.after(n5);
            System.out.println(n1.next.getData());
            System.out.println(n2.next.getData());
            System.out.println(n3.next.getData());
            System.out.println(n4.next.getData());
            System.out.println(n5.next.getData());
        }
    }

    测试结果

  • 相关阅读:
    Cleaning Up Children Asynchronously
    advacing lnux program 4.1.5 Thread Attributes[copy]
    advacing lnux program Threads Return Value[copy]
    批处理,所有子文件夹下面的所有文件
    .NET连接sybase乱码问题
    Asp.net forms认证遇到的一个奇怪的问题和测试过程
    WCF错误
    wcf超时错误
    gridControl控件显示交叉表
    K3 12.1修改报表Bug
  • 原文地址:https://www.cnblogs.com/Lovis/p/10728195.html
Copyright © 2020-2023  润新知