欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法与数据结构03-单链表与双链表

程序员文章站 2024-03-16 15:30:04
...

算法与数据结构03-单链表与双链表

== 说明:文章内容为跟着视频学习的文章,算不上原创,就是总结记录自己的学习过程==

单链表

package com.kele;

/**
 * @author 12402
 */
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;

            if (nextNode == null){
                break;
            }
            currentNode = nextNode;
        }
        currentNode.next = node;
        return this;
    }

    //获取下一个节点
    public Node next(){
        return this.next;
    }

    // 获取节点数据
    public int getData(){
        return this.data;
    }

    //判断是否为最后一个节点
    public boolean isLast(){
       return this.next == null;
    }

    // 删除节点
    public void remove(){
        Node nextNode = next.next;
        this.next = nextNode;
    }

    // 显示每个节点
    public void show(){
        Node currentNode = this;
        while (true){
            System.out.print(currentNode.data + " ");
            currentNode = currentNode.next;
            if (currentNode == null){
                break;
            }
        }
        System.out.println();
    }

    // 插入一个节点
    public void insert(Node node){
        // 将下一个节点定义为:再下一个节点
        Node nextNext = next;
        // 给下一个节点赋值
        this.next = node;
        // 将nextNext赋值给新节点的下一个节点,完成节点插入
        node.next = nextNext;

    }
}

双链表

package com.kele;

/**
 * @author 12402
 */
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 next(){
        return this.next;
    }

    // 获取上一个节点
    public DoubleNode pre(){
        return this.pre;
    }

    public int getData(){
        return this.data;
    }
}

循环链表

package com.kele;

/**
 * @author 12402
 */
public class LoopNode {

    // 节点内容
    int data;

    //当前节点指向开始节点,完成循环链表
    LoopNode next = this;

    public LoopNode(int data){
        this.data = data;
    }


    //获取下一个节点
    public LoopNode next(){
        return this.next;
    }

    // 获取节点数据
    public int getData(){
        return this.data;
    }


    // 删除节点
    public void remove(){
        LoopNode nextNode = next.next;
        this.next = nextNode;
    }

    // 插入一个节点
    public void insert(LoopNode node){
        // 将下一个节点定义为:再下一个节点
        LoopNode nextNext = next;
        // 给下一个节点赋值
        this.next = node;
        // 将nextNext赋值给新节点的下一个节点,完成节点插入
        node.next = nextNext;

    }
}

总结

  • 删除节点:将三个节点的最后一个节点赋值给中间节点,完成删除,是没有办法
    直接删除节点的。
  • 追加节点:先定义一个当前节点C,然后再定义一个下一个节点N, 将当前节点C的下一个节点赋值给定义的下一个节点N,
    判断N节点是否为空,如果为空直接跳出循环,将新节点n 赋值给C节点的下一个节点,完成节点插入。如果不为空,将N节点再赋值给当前节点C,继续寻找下一节点为空的
    的节点,找到后跳出循环,将新节点n赋值给C 节点,完成插入。
// 删除节点
public void append(Node node){
       Node currentNode = node;

       while (true){
           Node nextNode = currentNode.next;
           if (nextNode == null){
               break;
           }

           currentNode = nextNode;
       }

       currentNode.next = node;
   }
  • 插入节点:就是将下一个节点nextNode,往后推一个节点成为nextNext节点,然后给nextNode赋值,
    ,将nextNext节点赋值给nextNode节点的next节点,完成节点插入。
// 插入节点
   public void insert(Node node){
       LoopNode nextNext = next;

       this.next = node;

       node.next = nextNext;
   }