• 链表


    一.链表的概念及结构

    链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。

    value存数据,节点存下一个的地址,通过节点找下一个数据,每个节点都是一个对象

    注意:

    链式结构在逻辑上是连续的,但在物理上不一定连续】

    现实中的节点一般都是从堆上申请出来的

    从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续

    链0pooooooooooooooooooo表有非常多种,以下情况组合起来就有八种链表结构

    1.单向或双向

    2.带头或不带头

    3.循环或非循环

    我们重点掌握两种

    1.无头单向非循环列表:结构简单,一般不用来单独存数据,更多是作为其他数据结构的子结构,如哈希桶,图的邻接表等等

    2.无头双向链表:在Java的框架中,LinkedList底层实现就是无头双向循环链表

    二.链表的实现

    1.简单创建

    1. public class MySingleList {
    2. static class ListNode {
    3. public int val;//节点的值域
    4. public ListNode next;//下一个节点的地址
    5. public ListNode(int val) {
    6. this.val = val;
    7. }
    8. }
    9. public ListNode head;//表示当前链表的头节点
    10. public void createList() {
    11. ListNode node1 = new ListNode(12);
    12. ListNode node2 = new ListNode(23);
    13. ListNode node3 = new ListNode(34);
    14. ListNode node4 = new ListNode(45);
    15. ListNode node5 = new ListNode(56);
    16. node1.next = node2;
    17. node2.next = node3;
    18. node3.next = node4;
    19. node4.next = node5;
    20. this.head = node1;
    21. }
    22. }

    2.遍历链表

    1. public void display() {
    2. ListNode cur = head;
    3. while (cur != null) {
    4. System.out.print(cur.val+" ");
    5. cur = cur.next;
    6. }
    7. System.out.println();
    8. }

    注意head不能丢

    3.得到单链表的长度

    1. public int size(){
    2. int count = 0;
    3. ListNode cur = head;
    4. while (cur != null) {
    5. count++;
    6. cur = cur.next;
    7. }
    8. return count;
    9. }

    4.查找关键字key是否在单链表中

    1. public boolean contains(int key){
    2. ListNode cur = head;
    3. while (cur != null) {
    4. if(cur.val == key) {
    5. return true;
    6. }
    7. cur = cur.next;
    8. }
    9. return false;
    10. }

    5.头插法

    1. public void addFirst(int data){
    2. ListNode node = new ListNode(data);
    3. node.next = head;
    4. head = node;
    5. }

    6.尾插法

    1. public void addLast(int data){
    2. ListNode node = new ListNode(data);
    3. ListNode cur = head;
    4. if(cur == null) {
    5. head = node;
    6. return;
    7. }
    8. //找到链表的尾巴 注意是cur.next 不是cur
    9. while (cur.next != null) {
    10. cur = cur.next;
    11. }
    12. cur.next = node;
    13. }

    7.任意位置插入,第一个数据节点为0号下标

    1. public void addIndex(int index,int data){
    2. if(index < 0 || index > size()) {
    3. System.out.println("index 不合法");
    4. return;
    5. }
    6. if(index == 0) {
    7. addFirst(data);
    8. return;
    9. }
    10. if(index == size()) {
    11. addLast(data);
    12. return;
    13. }
    14. ListNode cur = findIndexSubOne(index);
    15. ListNode node = new ListNode(data);
    16. node.next = cur.next;
    17. cur.next = node;
    18. }
    19. /**
    20. * 找到要删除节点位置的前一个节点
    21. * @param index
    22. * @return
    23. */
    24. private ListNode findIndexSubOne(int index) {
    25. ListNode cur = head;
    26. while (index-1 != 0) {
    27. cur = cur.next;
    28. index--;
    29. }
    30. return cur;
    31. }

    8.删除第一次出现关键字为key的节点

    1. public void remove(int key){
    2. if(head == null) {
    3. return;
    4. }
    5. //单独删除头节点
    6. if(head.val == key) {
    7. head = head.next;
    8. return;
    9. }
    10. ListNode cur = searchPrev(key);
    11. if(cur == null) {
    12. System.out.println("没有你要删除的数字");
    13. return;
    14. }
    15. ListNode del = cur.next;
    16. cur.next = del.next;
    17. }
    18. /**
    19. * 找到关键字 key的前驱
    20. * @param key
    21. * @return
    22. */
    23. private ListNode searchPrev(int key) {
    24. ListNode cur = head;
    25. while (cur.next != null) {
    26. if(cur.next.val == key) {
    27. return cur;
    28. }
    29. cur = cur.next;
    30. }
    31. return null;
    32. }

    9.删除所有值为key的节点

    1. public void removeAllKey(int key){
    2. if(head == null) {
    3. return;
    4. }
    5. ListNode cur = head.next;
    6. ListNode prev = head;
    7. while (cur != null) {
    8. if(cur.val == key) {
    9. prev.next = cur.next;
    10. cur = cur.next;
    11. }else {
    12. prev = cur;
    13. cur = cur.next;
    14. }
    15. }
    16. if(head.val == key) {
    17. head = head.next;
    18. }
    19. }

    10.清空链表

    1. public void clear() {
    2. this.head = null;
    3. }

  • 相关阅读:
    Spring 的事务实现方式有哪些?
    ps2021神经滤镜不能下载,ps2021没法用神经元滤镜
    【GPU】Nvidia CUDA 编程高级教程——利用蒙特卡罗法求解 的近似值
    如何全面理解MES系统?
    Linux系统上搭建Java的运行环境,并且部署JavaWeb程序
    【爬虫实战】python微博热搜榜Top50
    当分布 非正态分布时,能否使用Pearson Correlation?
    (CVPR 2019)Associatively Segmenting Instances and Semantics in Point Clouds
    【pytest】html报告修改和汉化
    Vue--Axios详解
  • 原文地址:https://blog.csdn.net/xkroy/article/details/138200346