Java数据结构:链表

作者: Patarw | 来源:发表于2020-06-28 16:08 被阅读0次

单链表(Linked List)

链表是有序的列表,但是它在内存中的存储方式如下

image

1)链表是以节点的方式来存储,是链式存储

2)每个节点包含 data 域:存放数据, next 域:指向下一个节点的地址.

3)如图:发现链表的各个节点不一定是连续存储.

4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定;头节点不存放具体的数据,只用来表示单链表表头next域;

下面是单链表的逻辑结构:

双向链表

  • 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。
  • 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除。
  • 比单向列表多了一个pre域:用于存放上一个节点的地址。

使用代码实现单链表:

public class Java {     
  public static void main(String[] args) {               
    HeroNode a1 = new HeroNode(1,"老色皮1","哈哈1");
    HeroNode a2 = new HeroNode(2,"老色皮2","哈哈2");
    HeroNode a3 = new HeroNode(4,"老色皮3","哈哈3");
    HeroNode a4 = new HeroNode(3,"老色皮2","哈哈2");

       HeroLinklist list = new HeroLinklist();
       list.add(a1);
       list.add(a2);
       list.addByNo(a4);
       list.add(a3);
   
       HeroNode a = new HeroNode(1,"老色皮5","哈哈5");
       list.update(a);
       list.delete(2);
       list.list();
    }
}
//定义链表方法
class HeroLinklist{
//先初始化一个头节点,不存放具体数据
private HeroNode head = new HeroNode(0,"","");

//添加方法,直接添加到链表尾部
public void add(HeroNode heroNode) {
    HeroNode temp = head;
    //遍历节点,找到最后一个节点
    while(true) {
        if(temp.next == null) {
            break;
        }
        //不是的话就继续下一个
        temp = temp.next;
    }
    //将最后的节点指向新的节点
    temp.next = heroNode;
}

//列出链表数据
public void list() {
    HeroNode temp = head;
    //判断链表是否为空
    if(temp.next == null) {
        System.out.println("链表为空");
        return;
    }
    while(true) {
        if(temp.next == null) {
            break;
        }
        System.out.println(temp.next);
        temp = temp.next;
    }
}

//添加方法,按照no排序添加
public void addByNo(HeroNode heroNode) {
    HeroNode temp = head;
    boolean flag = false; //用于判断no是否重复
    
    while(true) {
        if(temp.next == null) {
            break;
        }
        if(temp.next.no > heroNode.no) {
            break;
        }else if(temp.next.no == heroNode.no) {
            flag = true;
            break;
        }
        temp = temp.next;
    }
    if(flag) {
        System.out.println("编号已存在,无法继续插入");
    }else {
        heroNode.next = temp.next;
        temp.next = heroNode;
    }
}

//修改链表节点数据
public void update(HeroNode newHeroNode) {
    HeroNode temp = head.next;
    if(temp == null) {
        System.out.println("链表为空!");
    }
    boolean flag = false;
    while(true) {
        if(temp == null) {
            break;
        }
        if(temp.no == newHeroNode.no) {
            flag = true;
            break;
        }
        temp = temp.next;
    }
    
    if(flag) {
        temp.name = newHeroNode.name;
        temp.nickname = newHeroNode.nickname;
    }else {
        System.out.println("no不存在");
    }
    
}

//删除节点
public void delete(int no) {
    HeroNode temp = head.next;
    HeroNode temp1 = head;
    if(temp ==null) {
        System.out.println("链表为空");
    }
    boolean flag = false;
    while(true) {
        if(temp ==null) {
            break;
        }
        if(temp.no == no) {
            flag = true;
            break;
        }
        temp = temp.next;
        temp1 = temp1.next;
    }
    if(flag) {
        temp1.next = temp.next;
    }else {
        System.out.println("no不存在");
    }
    }
}

  //定义HeroNode,每个HeroNode对象就是一个节点
class HeroNode{
public int no;
public String name;
public String nickname;
public HeroNode next; //指向下一个节点
public HeroNode(int no,String name,String nickname) {
    this.no = no;
    this.name = name;
    this.nickname = nickname;   
}
//重写toString方法
@Override
public String toString() {
    return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
 }
}

下一节:栈(stack)

https://www.jianshu.com/p/38b6ce825c30

相关文章

  • 数据结构 | 其二 链表

    冰河winner - 数据结构之链表 2.1 单向链表 数据结构(一) 单链表的实现-JAVA 2.2 双端链表 ...

  • 集合-LinkedList解析

    一、概要 Java中底层数据结构是链表、双端链表,Android中数据结构是双向循环链表 非线程安全数据结构,允许...

  • Java数据结构算法(二)栈和队列

    本文旨作于收集整理使用!! 导航 Java数据结构算法(一)链表 Java数据结构算法(三)树 Java数据结构算...

  • Java数据结构算法(三)树

    本文旨作于收集整理使用!! 导航 Java数据结构算法(一)链表 Java数据结构算法(二)栈和队列 Java数据...

  • Java数据结构算法(四)图

    本文旨作于收集整理使用!! 导航 Java数据结构算法(一)链表 Java数据结构算法(二)栈和队列 Java数据...

  • 算法与数据结构-链表((linked-list)-Java实现单

    title: 算法与数据结构-链表((linked-list)-Java实现单向链表 date: 2019-02-...

  • Java数据结构算法(五)排序

    算法这点粗略整理一下,后面完善 Java数据结构算法(一)链表 Java数据结构算法(二)栈和队列 Java数据结...

  • Java常用的数据结构

    Java常用的数据结构 Java中的数据结构: 数组(Array) 链表(Linked List 一种递归结构数据...

  • 用Java写单向链表

    数据结构—单向链表 为了巩固自己的基础知识,这次就用 Java 来写一个单向链表。问:什么是单向链表?首先链表是数...

  • 复习

    数据结构 数据结构 集合常见数据结构:集合,链表,队列,数组,栈,映射java中:List列表,Set集合,Map...

网友评论

    本文标题:Java数据结构:链表

    本文链接:https://www.haomeiwen.com/subject/tijwfktx.html