链表
链表是有序的列表。
- 链表是以节点的方式来存储,链式存储
- 每个节点包含data域,next域,指向下一个节点
- 链表的各个节点不一定是连续的存储
- 链表分带头节点的节点和没有带头结点的链表
应用实例代码实现(108好汉,无序、有序)
/**
*
*/
package com.stone.dataStructures;
/**
* @author Final
*
*/
public class singleLinkedList {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HeroNode heroNode1=new HeroNode(1, "宋江", "及时雨");
HeroNode heroNode2=new HeroNode(2, "卢俊义", "玉麒麟");
HeroNode heroNode4=new HeroNode(4, "林冲", "豹子头");
HeroNode heroNode3=new HeroNode(3, "吴勇", "智多星");
SingleLinked singleLinked=new SingleLinked();
// singleLinked.add(heroNode1);
// singleLinked.add(heroNode2);
// singleLinked.add(heroNode3);
// singleLinked.add(heroNode4);
singleLinked.addByIdOrder(heroNode1);
singleLinked.addByIdOrder(heroNode2);
singleLinked.addByIdOrder(heroNode3);
singleLinked.addByIdOrder(heroNode4);
singleLinked.list();
HeroNode heroNode5=new HeroNode(3, "吴老板", "派大星");
singleLinked.uodate(heroNode5);
singleLinked.delete(4);
singleLinked.list();
}
}
class SingleLinked{
//初始化头结点
private HeroNode head= new HeroNode(0,"","");
//找到最后节点
//将最后一个节点的next指向新的节点
public void add(HeroNode heroNode) {
HeroNode temp=head;
//遍历链表,找到最后
while(true) {
if (temp.next==null) {
break;
}
//如果没有找到最后,将temp后移
temp=temp.next;
}
//将最后这个节点的next指向新的节点
temp.next=heroNode;
}
public void list() {
//是否为空
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 addByIdOrder(HeroNode heroNode) {
HeroNode temp=head;
boolean flag=false;
while(true) {
if(temp.next==null) {
break;
}
if(temp.id>heroNode.id) {
break;
}else if(temp.next.id==heroNode.id){
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
System.out.println("编号已经存在,不能加入"+heroNode.id);
}else {
heroNode.next=temp.next;
temp.next=heroNode;
}
}
public void uodate(HeroNode no) {
//根据id修改
if(head.next==null) {
System.out.println("链表为空!");
}
HeroNode temp=head.next;
boolean flag=false;
while(true) {
if(temp==null) {
break;
}
if(temp.id==no.id) {
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
temp.name=no.name;
temp.nickname=no.nickname;
}else {
System.out.printf("没有找到编号%d的节点,不能修改\n",no.id);
}
}
/**
* 找到前一个节点,让其指向next.next
*/
public void delete(int no) {
HeroNode temp=head;
boolean flag=false;
while(true) {
if(temp.next==null) {
break;
}
if(temp.next.id==no) {
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
temp.next=temp.next.next;
}else {
System.out.println("要删除的节点找不到");
}
}
}
class HeroNode{
public int id;
public String name;
public String nickname;
public HeroNode next;
public HeroNode(int hno,String hName,String hNickName) {
this.id=hno;
this.name=hName;
this.nickname=hNickName;
}
@Override
public String toString() {
return "HeroNode [id=" + id + ", name=" + name + ", nickname=" + nickname + "]";
}
}