Java算法与数据结构——单链表(带头节点)

143 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

Java算法与数据结构——单链表

链表

链式存储结构 内存不连续 以节点的方式存储 节点包含数据域和指针域 链表分带有节点和无头节点的链表

单链表

在这里插入图片描述

各种操作的依赖

无论插入删除修改遍历我们所需要的实际上只需要让一个新节点(temp【在c里就是指针,Java中没有指针的概念,但其实就是类节点】)获取到我们要进行操作的链表就行

主要

搞清怎么操作指针域就行

temp = head
temp = temp.next

代码

链表节点

package linklist;

public class ListNode {
    public int id;
    //数据域
    public String data;
    //指针域
    public ListNode next;

    public ListNode(int id,String data){
        this.id = id;
        this.data = data;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "id=" + id +
                ", data='" + data + '\'' +
                '}';
    }
}

单链表实体类

package linklist;

public class SingleLinkList {
    //先初始化一个头节点,头节点不存放具体数据
    private ListNode head;

    public void initSingLinkList() {
        head = new ListNode(0, "");
    }

    //添加节点
    public void insertNode(ListNode listNode) {
        //使用temp指针进行遍历
        ListNode temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = listNode;
    }

    //打印链表
    public void showSingleLinkList() {
        if (isEmpty()) {
            return;
        }
        ListNode temp = head.next;
        while (true) {
            if (temp == null) {
                return;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }

    //判断链表是否为空
    public boolean isEmpty() {
        if (head.next == null) {
            System.out.println("链表为空");
            return true;
        }
        return false;
    }

    //按照id顺序添加节点
    public void insertByOrder(ListNode listNode) {
        ListNode temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.next.id > listNode.id) {
                break;
            } else if (temp.next.id == listNode.id) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag == true) {
            System.out.println("准备插入的数据编号已存在,无法添加");
        } else {
            listNode.next = temp.next;
            temp.next = listNode;
            System.out.println("插入成功");
        }
    }

    //修改节点数据
    public void updateNode(ListNode listNode) {
        ListNode temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null) {

                break;
            }
            if (temp.id == listNode.id) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.data = listNode.data;
        } else {
            System.out.println("没有找到要修改的节点");
        }
    }

    //删除节点
    public void delNode(int id) {
        ListNode temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.next.id == id) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.next = temp.next.next;

        } else {
            System.out.println("要删除的节点不存在");
        }
    }

    //获取头节点
    public void getHeadNode() {
        ListNode temp = head;
        if (temp.next == null && temp.id == 0) {
            System.out.println("该链表为空无法获取头节点");
        } else {
            temp = temp.next;
            System.out.println("头节点为:" + temp);
        }
    }

    //获取尾节点
    public void getTailNode() {
        ListNode temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null && temp.id == 0) {
                System.out.println("该链表为空无法获取尾节点");
                break;
            }
            if (temp.next == null) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            System.out.println("尾节点为:" + temp);
        } else {
            System.out.println("无法找到该节点");
        }

    }

    //清空链表
    public void clearLinkList() {
        ListNode temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null && temp.id == 0) {
                System.out.println("该链表为空无法清空");
                break;
            }
            temp = temp.next;
            temp.data = "";
            if (temp.next == null) {
                flag = true;
                break;
            }
        }
        if (flag) {
            System.out.println("清空完成");
        }
    }

    //获取长度
    public void getLength() {
        ListNode temp = head;
        int length = 0;
        while (true) {
            if (temp.next == null && temp.id == 0) {
                System.out.println("该链表为空长度为"+length);
                break;
            }
            temp = temp.next;
            length++;
            if (temp.next == null) {
                System.out.println("该链表为空长度为"+length);
                break;
            }
        }
    }
}

测试类

package linklist;

import java.util.Scanner;

public class SingleLinkListTest {
    public static void main(String[] args) {
        SingleLinkList singleLinkList = new SingleLinkList();
        int choose = -1;
        Scanner sc = new Scanner(System.in);
        boolean flag = true;
        while (flag) {
            System.out.println("============================");
            System.out.println("=========1.初始化队列========");
            System.out.println("=========2.添加节点=========");
            System.out.println("=========3.显示单链表=========");
            System.out.println("=========4.删除单链表节点========");
            System.out.println("=========5.获取头节点(指id = 1)========");
            System.out.println("=========6.获取单链表长度======");
            System.out.println("=========7.清空单链表=========");
            System.out.println("=========8.销毁单链表=========");
            System.out.println("=========9.获取尾节点========");
            System.out.println("=========10.修改节点数据========");
            System.out.println("=========0.退出exit=========");
            System.out.println("============================");
            System.out.println("请输入你的选择:");
            choose = sc.nextInt();
            if (choose == 0) {
                System.out.println("exit...");
                break;
            }
            switch (choose) {
                case 1:
                    singleLinkList.initSingLinkList();
                    break;
                case 2:
                    System.out.println("输入你要添加的数据:");
                    System.out.println("输入编号(大于等于1)");
                    int id = sc.nextInt();
                    System.out.println("输入你要添加的内容");
                    String data = sc.next();
                    ListNode listNode = new ListNode(id,data);
                    singleLinkList.insertByOrder(listNode);
                    break;
                case 3:
                    System.out.println("当前列表为:");
                    singleLinkList.showSingleLinkList();
                    break;
                case 4:
                    System.out.println("请输入你要移除的节点编号(大于等于0)");
                    int delId =sc.nextInt();
                    singleLinkList.delNode(delId);
                    break;
                case 5:
                    singleLinkList.getHeadNode();
                    break;
                case 6:
                    singleLinkList.getLength();
                    break;
                case 7:
                    singleLinkList.clearLinkList();
                    break;
                case 8:
                    singleLinkList = null;
                    System.out.println("已销毁--》自动停止程序》》》");
                    System.exit(0);
                    break;
                case 9:
                    singleLinkList.getTailNode();
                    break;
                case 10:
                    System.out.println("输入你要添加的数据:");
                    System.out.println("输入编号(大于等于1)");
                    int newId = sc.nextInt();
                    System.out.println("输入你要添加的内容");
                    String newData = sc.next();
                    ListNode newlistNode = new ListNode(newId,newData);
                    singleLinkList.updateNode(newlistNode);
                    break;
                default:
                    System.out.println("error");
                    break;
            }

        }

    }
}

程序截图

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述