单向链表 增删改遍历,以及部分题目练习
6. 链表(Linked List)
6.1 链表(Linked List)介绍

-
链表是以字节的方式来存储,链式存储
-
每个字节包含
data域:存储数据,next域:指向下一个节点 -
如图,发现链表的各个节点不一定是连续存放的(连续存储),而且是无序的
-
链表分为
带头结点的链表,和没有头结点的链表,根据需求决定
6.2 单链表
(逻辑结构示意图)

head(头节点):
-
不存放具体的数据
-
作用就是表示单链表的表头
6.2.1创建(添加)
-
先创建一个head头节点,作用就是单链表的头
-
后面我们每添加一个节点,就直接加入到链表的最后遍历
-
通过一个辅助遍历,帮助遍历整个链表
1 package linkedlist; 2 3 public class SingleLinkedListDemo { 4 public static void main(String[] args) { 5 // 进行测试 6 // 先创建节点 7 HeroNode hero1 = new HeroNode(1,"宋江", "及时雨"); 8 HeroNode hero2 = new HeroNode(2,"卢俊义", "玉麒麟"); 9 HeroNode hero3 = new HeroNode(3,"吴用", "智多星"); 10 HeroNode hero4 = new HeroNode(4,"林冲", "豹子头"); 11 HeroNode hero5 = new HeroNode(5,"武松", "行者"); 12 13 // 创建一个链表 14 SingleLinkedList singleLinkedList = new SingleLinkedList(); 15 // 加入 16 singleLinkedList.add(hero1); 17 singleLinkedList.add(hero2); 18 singleLinkedList.add(hero3); 19 singleLinkedList.add(hero4); 20 singleLinkedList.add(hero5); 21 22 // 显示 23 singleLinkedList.list(); 24 } 25 } 26 // 定义SingleLinkedList管理我们的英雄 27 class SingleLinkedList{ 28 // 先初始化一个头节点,头节点不要动, 不存放具体数据 29 private HeroNode head = new HeroNode(0,"",""); 30 31 // 添加节点到单向链表 32 // 思路:当不考虑编号顺序时 33 // 1. 找到当前链表的最后节点 34 // 2. 将最后这个节点的next 指向 新的节点 35 public void add(HeroNode heroNode){ 36 // 因为头节点不能东,因此我们需要一个辅助指针完成遍历 37 HeroNode temp = head; 38 // 遍历链表,找到最后 39 while (true){ 40 // 找到链表的最后 41 if (temp.next == null){ 42 break; 43 } 44 45 // 如果没有找到,将temp后移 46 temp = temp.next; 47 } 48 // 当退出while循环时,temp就指向了链表的最后 49 // 将最后这个节点的next 指向新的节点 50 temp.next = heroNode; 51 } 52 // 显示链表[遍历] 53 public void list(){ 54 // 判断链表是否为空 55 if (head.next == null){ 56 System.out.println("链表为空"); 57 return; 58 } 59 // 因为头节点不能东,因此我们需要一个辅助变量来遍历 60 HeroNode temp = head.next; 61 while (true){ 62 // 判断是否到链表最后 63 if (temp == null){ 64 break; 65 } 66 // 输出节点信息 67 System.out.println(temp); 68 // 将temp后移,一定要后移,不然是个死循环 69 temp = temp.next; 70 } 71 } 72 } 73 // 定义HeroNode 74 class HeroNode{ 75 public int no; 76 public String name; 77 public String nickname; 78 public HeroNode next; // 指向下一个节点 79 80 public HeroNode(int no, String name, String nickname) { 81 this.no = no; 82 this.name = name; 83 this.nickname = nickname; 84 85 } 86 // 为了显示方法,我们重写toString 87 @Override 88 public String toString() { 89 return "HeroNode{" + 90 "no=" + no + 91 ", name='" + name + '\'' + 92 ", nickname='" + nickname + 93 '}'; 94 } 95 }
