单向链表的增删查改
Posted train99999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单向链表的增删查改相关的知识,希望对你有一定的参考价值。
链表(Linked List)
链表是有序的列表
链表是以节点的方式来存储,是链式存储
每个节点包含data域,next域;指向下一个节点
链表的各个节点不一定是连续存储
链表分带头节点的链表和没有头节点的链表,根据实际需求来确定
单链表的增删改查
package linkedlist;
import javax.swing.plaf.synth.SynthSeparatorUI;
public class SingleLinkedListDemo
public static void main(String[] args)
//进行测试
HeroNode hero1 = new HeroNode(1,"宋江","及时雨");
HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");
HeroNode hero3 = new HeroNode(3,"吴用","智多星");
HeroNode hero4 = new HeroNode(4,"林冲","豹子头");
SingleLinkedList sl = new SingleLinkedList();
// sl.add(hero1);
// sl.add(hero2);
// sl.add(hero3);
// sl.add(hero4);
sl.addByOrder(hero1);
sl.addByOrder(hero2);
sl.addByOrder(hero4);
sl.addByOrder(hero3);
sl.list();
// HeroNode hn = new HeroNode(3,"小卢","玉麒麟~~");
// sl.updata(hn);
sl.del(3);
sl.list();
//创建SingleLinkedList 管理我们的英雄
class SingleLinkedList
//初始化头节点,头结点不要动,不存放具体的数据
private HeroNode head = new HeroNode(0,"","");
//添加节点到单向链表
//当不考虑编号顺序时
//找到当前链表的最后节点,将最后节点的next指向新的节点
public void add(HeroNode heroNode)
//因为Head节点不能动,因此我们需要一个辅助遍历temp
HeroNode temp = head;//temp为头指针,临时变量
//通过遍历链表,找到最后一个节点
//当循环结束之时,就是找到最后一个节点之日
while(true)
if(temp.next==null) //第一次调用add时temp.next等于null终止循环
break;//为null就跳出while循环
//如果没有找到最后,让temp往后移动,直到找到null为止
temp=temp.next;//存储传递进来的heroNode节点temp
//当退出while循环时,temp就指向链表最后
temp.next=heroNode;//跳出循环后,将传递进来的heroNode节点赋值给临时变量temp
//第二种方式在添加英雄时,根据排名奖英雄插入到指定位置
public void addByOrder(HeroNode heroNode)
HeroNode temp = head;
boolean flag = false;
while(true)
if(temp.next == null)//第二次添加英雄,不为null
break;
//假设一开始添加的第一个英雄宋江的编号为1,第二次添加的英雄编号为2,则1>2不成立,则执行temp = temp.next;
if(temp.next.no>heroNode.no)
break;
else if(temp.next.no == heroNode.no)
flag = true;
break;
//把1,宋江,及时雨,null 赋值给temp,这个时候再次执行循环,temp.next为null,
temp = temp.next;
if(flag)
System.out.println(heroNode.no+"号已经存在");
else
heroNode.next = temp.next;//当第一次添加英雄时,把null赋值给节点heroNode的属性next
temp.next = heroNode;//当第一次添加英雄时,把heroNode节点添加到temp类的属性next中去
//修改节点的信息,根据no编号来修改
public void updata(HeroNode newHeroNode)
//判断是否为空
if(head.next == null)
System.out.println("链表为空");
return;
//找到要修改的节点
HeroNode temp = head.next;
boolean flag = false;
while(true)
if(temp == null)
break;
if(temp.no == newHeroNode.no)
flag = true;
break;
System.out.println(temp.next+"测试");
temp = temp.next;
if(flag)
temp.name = newHeroNode.name;
temp.nickname=newHeroNode.nickname;
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.no == no)
flag = true;
break;
System.out.println(temp.next+"测试");//宋江
temp = temp.next;
System.out.println(temp.next+"测试");//卢俊义
if(flag)
temp.next = temp.next.next;
else
System.out.println("要删除的节点不存在");
//显示链表
public void list()
//判断链表是否为null
if(head.next==null)
System.out.println("链表为空");
//因为头节点不能动,因此需要一个辅助变量来遍历
HeroNode temp = head.next;
while(true)
if(temp==null)
break;
System.out.println(temp);
temp=temp.next;//指针后移
//定义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;
@Override
public String toString()
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
//这玩意真废脑子
以上是关于单向链表的增删查改的主要内容,如果未能解决你的问题,请参考以下文章