链表(Linked List)
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
单链表(single LinkedList)
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
如上图所示,每个结点包括两部分,数据部分,和下一节点的地址,头节点时不包含数据部分只含有下一节点的值,比如头节点指向地址为150的值,则头节点的下一结点的数据为a1,地址为150的下一节点的地址为110,以此类推,最后一个节点的地址为null,如需添加节点只需将最后一个节点的next指向新的节点即可。
- 链表是以节点的方式来存储,是链式存储
- 每个节点包含data域,next域:指向下一节点
- 如图:发现链表的各个节点不一定是连续存储
- 链表分带头结点的链表和没有头节点的链表,根据实际需求来确定
下面为实例
首先创建一个节点类
package LinkedList.SingleLinkedList;
//创建一个英雄,包括他的排名,名字,称号,还有next域
public class HeroNode {
public int number ;
public String name;
public String heroName;
public HeroNode next;
public HeroNode(int number, String name , String heroName){
this.name=name;
this.number = number;
this.heroName = heroName;
}
//重写toString方法方便显示
@Override
public String toString() {
return "HeroNode{" +
"number=" + number +
", name='" + name + '\'' +
", heroName='" + heroName + '\''
+
'}';
}
}
单链表类
package LinkedList.SingleLinkedList;
public class HeroLinkedList {
// 头节点是不变的,头节点没有数据。
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 upData(HeroNode newheronode){
if (head.next==null){
System.out.println("链表为空,修改失败");
return;
}
HeroNode temp = head.next;
boolean flag = false;
while (true){
if (temp.next==null){
break;
}if (temp.number== newheronode.number){
flag =true;
break;
}
temp = temp.next;
}
if (flag){
temp.heroName = newheronode.heroName;
temp.name = newheronode.name;
}else {
System.out.println("没有找到");
}
}
//删除节点
public void del(int no){
HeroNode temp = head;
boolean flag = false;
while (true){
if (temp.next==null){
break;
}if (temp.next.number == no){
flag = true;
break;
}
temp= temp.next;
}
if (flag){
temp.next = temp.next.next;
}else {
System.out.println("没有找到这和节点");
}
}
public void addByOrder(HeroNode heroNode){
HeroNode temp = head;
boolean flag = false;//标记是否已经存在相同序号的存在
while (true){
if (temp.next==null){
break;
}else if(temp.next.number>heroNode.number){
break;
}else if (temp.next.number== heroNode.number){
flag=true;
break;
}
temp = temp.next;
}
if (flag){
System.out.println("该节点已经存在");
}else {
heroNode.next = temp.next;
temp.next = heroNode;
}
}
/*
public void show(){
if (head.next==null){
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
while (true){
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
*/
public void show() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
while (true) {
System.out.println(temp);
if (temp.next == null) {
break;
}
temp = temp.next;
}
}
}
测试类
package LinkedList.SingleLinkedList;
public class SingleLinkedList {
public static void main(String[] args) {
HeroNode hero1 = new HeroNode(0,"宋江","a");
HeroNode hero2 = new HeroNode(1,"s","s");
HeroNode hero3 = new HeroNode(2,"d","d");
HeroNode hero4 = new HeroNode(3,"w","w");
HeroLinkedList linkedList = new HeroLinkedList();
// linkedList.add(hero1);
// linkedList.add(hero2);
// linkedList.add(hero3);
// linkedList.add(hero4);
HeroNode newheronode = new HeroNode(4,"gggg","sss");
linkedList.addByOrder(hero1);
linkedList.addByOrder(hero3);
linkedList.addByOrder(hero2);
linkedList.addByOrder(hero4);
linkedList.show();
System.out.println("--------");
// linkedList.upData(newheronode);
linkedList.del(3);
linkedList.del(0);
linkedList.del(1);
linkedList.del(2);
linkedList.show();
}
}