链表基础用法

单链表

单链表通过next节点,把每一个元素串联起来,形成一个链状结构

基本用法:

  1 写一个节点类,包含要存储的元素,还要一个next节点。

   2 写一个链表类,类中最重要的就是一个头节点,其他元素不用保存,单链表就是通过头节点  ,   管理每一个节点的。不过头节点一般不能动,都是使用临时变量进行操作

   3 在链表类中实现各种操作的方法

package LinkedList;

public class SingleLinkListDemo {

    public static void main(String[] args) {

        VTuberNode vTuberNode = new VTuberNode(1, "东雪莲", "管人痴");
        VTuberNode vTuberNode1 = new VTuberNode(2, "嘉然", "嘉心糖");
        VTuberNode vTuberNode2 = new VTuberNode(3, "永雏塔菲", "热水器");
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.addVTuber(vTuberNode);
        singleLinkedList.addVTuber(vTuberNode1);
        singleLinkedList.addVTuber(vTuberNode2);

        singleLinkedList.addOrderBy(vTuberNode2);
        singleLinkedList.showList();
        System.out.println("\n\n");


        singleLinkedList.update(new VTuberNode(2, "嘉然", "主人"));
        singleLinkedList.showList();
        System.out.println("\n\n");


        singleLinkedList.delete(new VTuberNode(2, "嘉然", "主人"));
        singleLinkedList.showList();
        System.out.println("\n\n");


        singleLinkedList.addOrderBy(vTuberNode1);
        singleLinkedList.showList();
        System.out.println("\n\n");


    }


}

//链表类,用于管理每一个节点,单链表我们只要保存它的头节点就可以了(这个很重要),通过头节点进行管理。
class SingleLinkedList {
    //初始化头节点,这个头节点是不能动的,//不存放具体数据
    private VTuberNode head = new VTuberNode(0, " ", " ");

    //添加方法
    //找到最后一个,把它的next指向
    public void addVTuber(VTuberNode vTuberNode) {
        VTuberNode temp = head;//头节点不能动,所以需要一个临时变量,指向头节点
        while (true) {
            if (temp.next == null) {
                break;//找到就返回
            }


            temp = temp.next;

        }
        //结束循环后,就指向了最后一个元素
        temp.next = vTuberNode;//

    }

    //输出链表
    public void showList() {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }

        //头节点不能动,需要一个辅助变量遍历

        VTuberNode temp = head.next;

        while (true) {
            if (temp == null) {
                break;//到链表尾了
            }

            System.out.println(temp);
            temp = temp.next;

        }


    }

    //顺序插入方法

    public void addOrderBy(VTuberNode vTuberNode) {
        VTuberNode temp = head; //临时
        boolean flag = false;    //记录是否已经存在这样一个节点了,默认是不存在
        while (true) {
            if (temp.next == null) //到链表的尾部了
                break;
            if (temp.next.no == vTuberNode.no)//找到了相同的节点
            {
                flag = true;
                break;

            }

            if (temp.next.no > vTuberNode.no)//找的位置了
            {
                break;
            }

            temp = temp.next;

        }

        if (flag) {
            System.out.println("添加失败。这个节点已经存在了");
            return;

        }

        VTuberNode temp2 = temp.next;

        temp.next = vTuberNode;
        vTuberNode.next = temp2;
        System.out.println("添加成功");


    }

    //更新节点的方法,序列号不变,其他信息做修改

    public void update(VTuberNode vTuberNode) {

        boolean flag = false;//记录是否存在这个节点
        VTuberNode temp = head;

        while (true) {
            if (temp.next == null) {
                break;
            }
            //没有找到
            if (temp.next.no == vTuberNode.no) {
                flag = true;
                break;
            }

            temp = temp.next;
        }

        if (!flag) {
            System.out.println("更新失败,不存在这样一个节点");
            return;
        }

        VTuberNode temp2 = temp.next.next;
        temp.next = vTuberNode;
        vTuberNode.next = temp2;
        System.out.println("修改成功");


    }

    //删除节点的方法
    //由于是单链表,我们需要找到前一个一个元素

    public void delete(VTuberNode vTuberNode) {
        VTuberNode temp = head;
        boolean flag = false;

        while (true) {
            if (temp.next == null) {
                break;
            }
            //没有找到
            if (temp.next.no == vTuberNode.no) {
                flag = true;
                break;
            }

            temp = temp.next;
        }

        if (!flag) {

            System.out.println("删除失败,不存在这样一个元素");

            return;

        }
        temp.next = temp.next.next;//重新指向
        System.out.println("删除成功");
    }


}


class VTuberNode { //节点类

    public int no;//顺序
    public String name; //名字
    public String nickname;//昵称
    public VTuberNode next;//下一个节点

    public VTuberNode(int no, String name, String nickname) { //构造方法
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "VTuberNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\''
                +
                '}';
    }
}

双向链表

相对于单链表的区别就是它有头指针和尾指针,分别指向前一个元素和后一个元素。有了两个指针,方便了很多操作

package LinkedList;

import java.util.LinkedList;

public class DoubleLinkedListDemo {

    public static void main(String[] args) {

        VTuberNode2 vTuberNode = new VTuberNode2(1, "东雪莲", "管人痴");
        VTuberNode2 vTuberNode1 = new VTuberNode2(2, "嘉然", "嘉心糖");
        VTuberNode2 vTuberNode2 = new VTuberNode2(3, "永雏塔菲", "热水器");
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();

        doubleLinkedList.addVTuber(vTuberNode);
        doubleLinkedList.addVTuber(vTuberNode1);
        doubleLinkedList.addVTuber(vTuberNode2);
        doubleLinkedList.showList();
        System.out.println("\n\n");

        VTuberNode2 vTuberNode3 = new VTuberNode2(2, "嘉然", "主人");
        doubleLinkedList.update(vTuberNode3);
        doubleLinkedList.showList();
        System.out.println("\n\n");


       doubleLinkedList.delete(vTuberNode3);
        doubleLinkedList.showList();
        System.out.println("\n\n");

        VTuberNode2 vTuberNode4 = new VTuberNode2(2, "嘉然", "嘉心糖");
        doubleLinkedList.addVTuber(vTuberNode4);
        doubleLinkedList.showList();
        System.out.println("\n\n");
    }


}

class DoubleLinkedList {

    private VTuberNode2 head = new VTuberNode2(0, "", "");

    //遍历方法

    public void showList() {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }

        //头节点不能动,需要一个辅助变量遍历

        VTuberNode2 temp = head.next;

        while (true) {
            if (temp == null) {
                break;//到链表尾了
            }

            System.out.println(temp);
            temp = temp.next;

        }


    }

    //添加方法

    public void addVTuber(VTuberNode2 vTuberNode) {
        VTuberNode2 temp = head;//头节点不能动,所以需要一个临时变量,指向头节点
        while (true) {
            if (temp.next == null) {
                break;//找到就返回
            }


            temp = temp.next;

        }
        //结束循环后,就指向了最后一个元素,形成一个双向链表
        temp.next = vTuberNode;//
        vTuberNode.pre = temp;//


    }

    //修改方法
    public void update(VTuberNode2 vTuberNode) {

        boolean flag = false;//记录是否存在这个节点
        VTuberNode2 temp = head.next;
          if(temp==null)
          {
              System.out.println("更新失败,不存在这样一个节点");
              return;
          }

        while (true) {

            //没有找到
            if (temp.no == vTuberNode.no) {
                flag = true;
                break;
            }

            temp = temp.next;
        }

        if (!flag) {
            System.out.println("更新失败,不存在这样一个节点");
            return;
        }

        temp.name = vTuberNode.name;
        temp.nickname = vTuberNode.nickname;
        System.out.println("修改成功");


    }

    //删除节点方法
    public void delete(VTuberNode2 vTuberNode) {

        VTuberNode2 temp = head.next;
        boolean flag = false;
        if (head.next == null) {
            System.out.println("删除失败,不存在这样一个元素");

            return;
        }

        while (true) {
            if (temp == null) {
                break;
            }
            if (temp.no == vTuberNode.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.pre.next = temp.next;
            if (temp.next != null) {//最后一个元素不为空
                temp.next.pre = temp.pre;

            }
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败,元素不存在");
        }
    }


}


class VTuberNode2 { //节点类

    public int no;//顺序
    public String name; //名字
    public String nickname;//昵称
    public VTuberNode2 next;//下一个节点
    public VTuberNode2 pre;//前一个节点

    public VTuberNode2(int no, String name, String nickname) { //构造方法
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "VTuberNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\''
                +
                '}';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值