zoukankan      html  css  js  c++  java
  • 04-单链表

    1. 简单介绍

    • 链表是一组任意的存储单元,通过指针链接,串成一个链子
    • 数据元素的存储映象,称为 [结点],由两部分构成
      • 数据域:用来存储数据
      • 指针域:存储后继结点的地址
    • 专业术语
      • 头结点:数据域不存储信息;指针域存储 [首结点] 的地址
      • 首结点:第一个存放有效数据的结点
      • 尾结点:最后一个存放有效数据的结点

    2. 链表的分类

    3. 单链表功能点思路

    • 添加结点
    • 按编号顺序添加结点
    • 删除结点

    4. 代码实现

    public class SingleLinkedList {
        // 先初始化 [头结点], 头结点不存放数据
        private HeroNode head = new HeroNode(0,"","");
    
        public HeroNode getHead() {
            return head;
        }
    
        // 添加结点到单链表(不考虑编号顺序)
        public void add(HeroNode node) {
            // 1. 找到 [尾结点], 将其尾结点的next域指向 {要添加的结点}
            // 1.1 定义一个临时变量, 用来指向链表当前遍历到的元素
            HeroNode temp = head;
            // 1.2 遍历:当退出while循环时, temp此时指向的是尾结点
            while (temp.next != null) temp = temp.next;
    
            // 2. 将新节点的地址赋值给尾结点的指针域
            temp.next = node;
        }
    
        // 根据排名将结点插入指定位置(如果有这个排名, 则添加失败, 并给出提示)
        public void insertByOrder(HeroNode node) {
            // 1. 找到新结点要插入的位置(遍历 + 辅助变量)
            // 1.1 因为是单链表, 所以temp最终应指向 新结点要放置位置的前一个结点
            HeroNode temp = head;
            // 1.2 用来标识新结点的编号是否已存在
            boolean flag = false;
            // 1.3 循环终止时, temp指向链表尾结点
            while (temp.next != null) {
                if (temp.next.no > node.no) { // find it!
                    break;
                } else if (temp.next.no == node.no) { // 说明编号已存在
                    flag = true;
                    break;
                }
                temp = temp.next; // 后移
            }
    
            // 2. 新结点应插入到 temp 和 temp.next 之间
            if (!flag) {
                node.next = temp.next;
                temp.next = node;
            } else { // 不能加入, 编号已存在
                System.out.printf("编号%d已存在, 不能插入
    ", node.no);
            }
        }
    
        // 根据编号修改结点数据
        public void updateByNo(HeroNode node) {
            // 1. 判断链表是否空
            if (head.next == null) System.out.println("链表为空");
    
            // 2. 标识是否找到该结点
            boolean flag = false;
    
            // 3. 遍历链表
            HeroNode temp = head.next;
            while (temp != null) {
                if(temp.no == node.no) {
                    flag = true;
                    break;
                }
                temp = temp.next;
            }
    
            // 4. flag 标识是否找到了要修改的结点
            if (flag) {
                temp.name = node.name;
                temp.nickname = node.nickname;
            } else System.out.printf("不存在编号为%d的结点
    ", node.no);
        }
    
        // 删除结点
        public void deleteNode(int no) {
            // 1. 判断链表是否空
            if (head.next == null) {
                System.out.println("链表为空");
                return;
            }
    
            // 2. 标识是否找到该结点
            boolean flag = false;
    
            // 3. 找待删除结点的前一个结点temp
            HeroNode temp = head;
            while (temp.next != null) {
                if (temp.next.no == no) {
                    flag = true;
                    break;
                }
                temp = temp.next;
            }
    
            // 4. flag 标识是否找到了要删除的结点
            if (flag) {
                // 待删除结点因没有任何引用指向, 故会被垃圾回收机制回收
                temp.next = temp.next.next;
            } else {
                System.out.printf("不存在编号为%d的结点
    ", no);
            }
        }
    
        // 打印链表(遍历)
        public void showList() {
            if (head.next == null) {
                System.out.println("链表为空");
                return;
            }
    
            // 头结点不能动, 需要一个临时变量来遍历
            HeroNode temp = head.next;
            while (temp != null) {
                System.out.println(temp);
                temp = temp.next;
            }
        }
    }
    
    // 定义HeroNode, 每个HeroNode对象就是一个结点
    class HeroNode {
        public int no;
        public String name;
        public String nickname;
        public HeroNode next;
    
        public HeroNode(int no, String name, String nickname) {
            super();
            this.no = no;
            this.name = name;
            this.nickname = nickname;
            this.next = null;
        }
    
        @Override
        public String toString() {
            return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
        }
    }
    
  • 相关阅读:
    基于express框架的Token实现方案
    书籍整理
    openfire4.0.2开发环境搭建(windows)
    Express4.x动态的销毁或者替换中间件(app.unuse)
    mysql学习笔记(三)----函数
    mysql学习笔记(二)----数据类型
    mysql学习笔记(一)----建表操作
    Windows-mysql5.7安装
    JavaScript学习笔记–(new关键字)
    n枚硬币问题(找假币)
  • 原文地址:https://www.cnblogs.com/liujiaqi1101/p/12214444.html
Copyright © 2011-2022 走看看