Memorydoc
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
    • HTML
    • CSS
    • 前端拓展
  • 编程之道

    • 并发编程
    • 设计模式
    • 数据结构算法
    • 技术拓展
    • 技术陷阱
    • 面试宝典
  • 分布式

    • 微服务
    • 数据库
  • 项目优化实战

    • JVM 优化
    • 线程池优化
    • 模板引擎优化
    • 任务调度优化
    • 内存优化
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Memorydoc

术尚可求
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
    • HTML
    • CSS
    • 前端拓展
  • 编程之道

    • 并发编程
    • 设计模式
    • 数据结构算法
    • 技术拓展
    • 技术陷阱
    • 面试宝典
  • 分布式

    • 微服务
    • 数据库
  • 项目优化实战

    • JVM 优化
    • 线程池优化
    • 模板引擎优化
    • 任务调度优化
    • 内存优化
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 并发编程

  • 设计模式

  • 数据结构算法

    • 普通队列
    • 环形队列
    • 单链表实现
      • 单链表
    • 负载均衡算法
  • 技术拓展

  • 技术陷阱

  • 面试宝典

  • 微服务

  • 数据库

  • 项目优化背景

  • JVM优化

  • 技术架构
  • 数据结构算法
Memorydoc
2022-03-07

单链表实现原创

# 单链表

注意

add 方法是普通的往链表中插入数据 addByOrder 是将插入的节点排序,并判断当前节点是否已经存在,如果存在则禁止重复插入

package com.pwc.datastructure.linklist;

/**
 * 单链表
 */
public class SingLinkListDemo {
    public static void main(String[] args) {
        //创建节点
        HearNode hearNode1 = new HearNode("宋江", 1, "宋江");

        HearNode hearNode2 = new HearNode("刘备", 2, "刘备");

        HearNode hearNode3 = new HearNode("曹操", 3, "曹操");

        HearNode hearNode4 = new HearNode("张飞", 4, "张飞");

        //将节点加入链表

     /*   SingLinkList singLinkList = new SingLinkList();
        singLinkList.add(hearNode1);
        singLinkList.add(hearNode2);
        singLinkList.add(hearNode3);
        singLinkList.add(hearNode4);
        singLinkList.list();*/

        // 按照节点的no顺序将数据插入到链表中

        SingLinkList singLinkList = new SingLinkList();

        singLinkList.addByOrder(hearNode1);
        singLinkList.addByOrder(hearNode3);
        singLinkList.addByOrder(hearNode2);
        singLinkList.addByOrder(hearNode4);
        singLinkList.addByOrder(hearNode2); //这里就不能再插入 节点2了
        singLinkList.list();
    }

}

// 创建SingLinkList单链表 管理节点(HearNode)
class SingLinkList {
    //初始化一个头节点
    private HearNode head = new HearNode("", 0, "");//头结点不存储具体的数据,只是为了寻找链表的头

    public void add(HearNode hearNode) {//添加节点的时候,要添加到链表的最后
        // 思路: 当不考虑编号的顺序时, 找到当前链表的最后一个节点,将最后这个节点的next域指向这个新的 hearNode 节点
        // 因为head 节点不能动,因此我们需要一个辅助指针
        HearNode temp = head;


        //开始使用这个temp指针去找最后一个节点,最后一个节点有什么特点呢? 那就是next 是为null的 就是 最后一个节点
        while (true) {
            if (temp.next == null)
                break;
            //如果找到的不是null,那么将temp的指针往后移
            temp = temp.next;
        }
        temp.next = hearNode; //这时的temp已经指向最后一个节点了
    }

    public void addByOrder(HearNode hearNode){

        //首先 要通过辅助指针,找到 要添加节点位置的前一个节点
        HearNode temp = head;// 辅助指针从头位置开始查找
        boolean isExist = false;// 判断当前节点是否存在
        while (true){
            if(temp.next == null) //这种情况是  当前temp指针指向最后一个元素了,可以直接使用这个temp指向的对象
                break;
            if(temp.next.no > hearNode.no){//说明 temp已经到了要插入的节点的位置的下一个位置
                break;
            }
            if(temp.next.no == hearNode.no){//说明当前节点的数据已经存在
                isExist = true;
            }
            temp = temp.next;
        }
        if(isExist){
            System.out.printf("当前编号数据 %d 已经存在,不能插入 \n", hearNode.no);
        }else{
            //将节点加入到链表中
            // 首先将当前要插入的节点的next域指针连接
            hearNode.next = temp.next;
            // 然后将temp指针的next指针指向 当前插入的节点
            temp.next = hearNode;
        }
    }




    //显示遍历链表

    public void list() {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        HearNode temp = head.next;
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }


}


//定义一个节点  这里自定义 HearNode  节点类名
class HearNode {
    public String nickName;
    public int no;
    public String name;
    public HearNode next;//指向下一个节点(next域)

    public HearNode(String nickName, int no, String name) {
        this.nickName = nickName;
        this.no = no;
        this.name = name;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setNext(HearNode next) {
        this.next = next;
    }

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
编辑 (opens new window)
上次更新: 2022/03/13, 21:24:24
环形队列
负载均衡算法

← 环形队列 负载均衡算法→

最近更新
01
命令模式 原创
05-03
02
桥接模式 原创
05-02
03
优雅写代码三 原创
04-29
更多文章>
Theme by Memorydoc | Copyright © 2021-2022 Memorydoc | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式