pursue wind pursue wind
首页
Java
Python
数据库
框架
Linux
中间件
前端
计算机基础
DevOps
项目
面试
书
关于
归档
MacOS🤣 (opens new window)
GitHub (opens new window)
首页
Java
Python
数据库
框架
Linux
中间件
前端
计算机基础
DevOps
项目
面试
书
关于
归档
MacOS🤣 (opens new window)
GitHub (opens new window)
  • 技术面试题篇

    • 系统设计

    • Java

    • 数据库

    • 常见框架

    • 分布式&微服务

    • 高并发

    • 服务器

    • 数据结构

      • 二叉搜索树
      • 链表
        • 栈
        • 红黑树
      • 算法

    • 面试准备篇

    • 技术面试题自测篇

    • 练级攻略篇

    • 工作篇

    • 面经篇

    • 笑傲Java面试

    • LeetCode

    • 面试
    • 技术面试题篇
    • 数据结构
    pursuewind
    2022-12-08
    目录

    链表

    # 链表实现

    package datastructure;
    
    import org.junit.Test;
    
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.function.Predicate;
    
    import static org.junit.Assert.assertEquals;
    
    
    public class List<T> {
        static class Node<T> {
            Node<T> next = null;
            T data;
    
            public Node(T data) {
                this.data = data;
            }
        }
    
        Node<T> head = null;
    
        // O(1)
        public void insert(T data) {
            var node = new Node<>(data);
            node.next = head;
            head = node;
    
        }
    
        // O(n)
        public Node<T> find(Predicate<T> predicate) {
            var p = head;
            while (p != null) {
                if (predicate.test(p.data)) {
                    return p;
                }
                p = p.next;
            }
            return null;
    
        }
    
        public Integer size() {
            var p = head;
            Integer c = 0;
            while (p != null) {
                p = p.next;
                c++;
            }
            return c;
        }
    
        // O(n)
        public void remove(Node<T> node) {
            if (head == null) {
                return;
            }
    
            if (head == node) {
                head = head.next;
                return;
            }
    
            var slow = head;
            var fast = head.next;
    
            while (fast != node && fast != null) {
                slow = fast;
                fast = fast.next;
            }
            if (fast != null) {
                slow.next = fast.next;
    //            fast.data = null;
            }
    
        }
    
    
        /**
         * 反转链表
         */
        public void reverse() {
            // prev | current | next
    
            Node<T> prev = null;
            var current = head;
            Node<T> next;
            while (current != null) {
                next = current.next;
                current.next = prev;
                prev = current;
                current = next;
            }
            head = prev;
    
        }
    
    
        /**
         * 递归反转链表
         */
        private Node<T> _reverse2(Node<T> head) {
            if (head == null || head.next == null) {
                return head;
            }
    
            var rest = _reverse2(head.next);
            head.next.next = head;
            head.next = null;
            return rest;
        }
    
        public void reverse2() {
            head = _reverse2(head);
        }
    
        public boolean hasLoop1() {
            var set = new HashSet<>();
    
            var p = head;
            while (p != null) {
                if (set.contains(p)) {
                    return true;
                }
                set.add(p);
                p = p.next;
            }
            return false;
        }
    
        /**
         * 快慢指针判断是否有环
         */
        public boolean hasLoop2() {
            if (head == null || head.next == null) {
                return false;
            }
    
            var slow = head;
            var fast = head.next.next;
            while (fast != null && fast.next != null) {
                if (fast == slow) {
                    return true;
                }
                slow = slow.next;
                fast = fast.next.next;
            }
            return false;
        }
    
    
        @Test
        public void test_insert() {
            var list = new List<Integer>();
            list.insert(1);
            list.insert(2);
            list.insert(3);
    
            var p = list.head;
            for (Integer i = 3; p != null; i--) {
                assertEquals(i, p.data);
                p = p.next;
            }
        }
    
        @Test
        public void test_find_remove() {
            var list = new List<String>();
    
            list.insert("C++");
            list.insert("Java");
            list.insert("C");
            list.insert("C#");
            list.insert("python");
    
            var node = list.find(x -> x == "Java");
            assertEquals("Java", node.data);
    
            var node2 = list.find(x -> x == "ruby");
            assertEquals(null, node2);
    
            list.remove(node);
            assertEquals(Integer.valueOf(4), list.size());
            assertEquals(null, list.find(x -> x == "Java"));
        }
    
        @Test
        public void test_reverse() {
            var list = new List<Integer>();
    
            list.insert(1);
            list.insert(2);
            list.insert(3);
            list.reverse();
    
            var p = list.head;
            for (Integer i = 1; p != null; i++) {
                assertEquals(i, p.data);
                p = p.next;
            }
        }
    
        @Test
        public void test_reverse2() {
            var list = new List<Integer>();
    
            list.insert(1);
            list.insert(2);
            list.insert(3);
            list.reverse2();
    
            var p = list.head;
            for (Integer i = 1; p != null; i++) {
                assertEquals(i, p.data);
                p = p.next;
            }
        }
    
        @Test
        public void test_loop() {
            var list = new List<Integer>();
            list.insert(3);
            list.insert(2);
            list.insert(1);
            list.insert(0);
            var node = list.find(x -> x == 3);
            node.next = list.head;
    
            assertEquals(true, list.hasLoop1());
            assertEquals(true, list.hasLoop2());
    
        }
    
    }
    
    
    
    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
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    Last Updated: 2023/01/30, 11:01:00
    二叉搜索树
    栈

    ← 二叉搜索树 栈→

    Theme by Vdoing | Copyright © 2019-2023 pursue-wind | 粤ICP备2022093130号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    • 飙升榜
    • 新歌榜
    • 云音乐民谣榜
    • 美国Billboard榜
    • UK排行榜周榜
    • 网络DJ