单链表(JAVA实现)

概念:链表是有序的列表,在内存中存储如下:
在这里插入图片描述
小结:
(1)链表是以节点的方式来存储,是链式存储
(2)每个节点包含data域、next域(用于指向下一个节点)
(3)链表每个节点不一定是连续存储
(4)链表分带头节点和不带头节点链表(根据需求确定)

单链表(带头节点)逻辑结构示意图:
在这里插入图片描述
单链表的创建:(不考虑节点顺序)
示意图:
在这里插入图片描述

步骤:
1、先创建一个Head节点,作用就是表示单链表的头
2、后面没添加一个节点,就直接加入到链表的最后
3、遍历:通过一个辅助变量帮助遍历整个单链表

单链表节点添加(按节点顺序)
在这里插入图片描述
步骤:
1、首先找到新添加的节点的位置,通过辅助变量(temp),遍历找到
2、新的节点.next=temp.next
3、temp.next=新节点

删除节点
在这里插入图片描述
步骤:
1、先找到需要删除的这个节点的前一个节点temp
2、temp.next=temp.next.next
3、被删除的节点,将不会在有其他引用的指向,会被垃圾回收机制回收

代码实现:

public class SigleLinkedList {
	 //创建头结点。表示链表的头
	private Node Head=new Node(0,"","");
	
	//AddNode1:添加节点到单链表的尾部
	//思路:当不考虑节点顺序
	//1、找到链表的最后一个节点
	//2、将最后这个节点的Next指向新节点
	public void AddNode1(Node node) {
		//因为头节点不能动,所以需要一个辅助节点遍历
		Node temp=Head;
		while(true) {
			//找到链表的最后一个节点
			if(temp.next==null) {
				break;
			}
			//否则temp=temp的下一个节点
			temp=temp.next;
		}
		//循环出来之后,temp是最后一个节点
		temp.next=node;
	}
	
	
	//AddNode2:添加节点,按顺序
	public void AddNode2(Node node) {
		//因为头结点不能动,所以需要一个辅助节点遍历,找到添加新节点的位置
		Node temp=Head;
		boolean flag=false; //用于标识链表中是否已经存在新节点的顺序
		while(true) {
			//如果该节点是最后一个节点,则新节点添加到最后一个位置
			if(temp.next==null) {
				break;
			}else if(temp.next.number>node.number) { //说明找到了添加新节点的位置
				break;
			}else if(temp.next.number==node.number) { //说明新节点的顺序已经存在在链表中
				flag=true;
			}
			temp=temp.next;
		}
		if(flag) {
			System.out.println("该节点的顺序已经存在,插入失败");
		}else {
			//则说明新节点在链表中不存在,插入新节点
			//新节点的下一个节点=辅助节点的下一个节点
			node.next=temp.next;
			//辅助节点的下一个节点=新节点
			temp.next=node;
		}
		
	}
	
	//删除节点
	public void remove(Node node) {
		if(Head.next==null) {
			System.out.println("链表为空!");
			return;
		}
		//创建辅助节点
		Node temp=Head;
		boolean flag=false; //标识是否找到了要删除的节点
		while(true) {
			if(temp.next==null) { //遍历完链表了
				break;
			}else if(temp.next.number==node.number) { //找到要删除的节点了
				flag=true;
				break;
			}
			temp=temp.next;
		}
		if(flag) { //链表中存在要删除的节点
			temp.next=temp.next.next;
		}else {
			System.out.printf("不存在编号为%d的节点",node.number);
		}
	}
	
	//修改节点,按照节点的Number来修改
	public void update(Node newNode) {
		if(Head.next==null) {
			System.out.println("链表为空!");
			return;
		}
		//创建辅助节点,对链表遍历,知道找到等于修改节点的number的时候
		Node temp=Head.next;
		boolean flag=false; //用来标识是否找到了修改节点的Number
		while(true) {
			if(temp==null) { //则已经遍历完链表
				break;
			}
			if(temp.number==newNode.number) {
				flag=true;
				break;
			}
			temp=temp.next;
		}
		if(flag) {
			temp.name=newNode.name;
			temp.nickName=newNode.nickName;
		}else {
			System.out.printf("没有找到编号为%d的节点",newNode.number);
		}
	}
	//展示链表
	public void show() {
		if(Head.next==null) {
			System.out.println("链表为空!");
			return;
		}
		//因为头节点不能动,所以通过辅助节点遍历链表
		Node temp=Head.next;
		while(true) {
			//判断是不是最后一个节点
			if(temp.next==null) {
				System.out.println(temp);
				break;
			}
			System.out.println(temp);
			//temp指向下一个节点
			temp=temp.next;
		}
	}

}

//创建节点
class Node{
	public int number;
	public String name;
	public String nickName;
	public Node next; //指向下一个节点
	
	//构造器
	public Node(int number,String name,String nickName) {
		this.number=number;
		this.name=name;
		this.nickName=nickName;
		
		
	}

	@Override
	public String toString() {
		return "Node [number=" + number + ", name=" + name + ", nickName=" + nickName + "]";
	}
}

检验:

public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Node node1=new Node(1,"宋江","及时雨");
		Node node2=new Node(2,"卢俊义","玉麒麟");
		Node node3=new Node(3,"吴用","智多星");
		Node node4=new Node(4,"林冲","豹子头");
		
		//创建一个链表
		SigleLinkedList linkedList=new SigleLinkedList();
		linkedList.AddNode2(node1);
		linkedList.AddNode2(node3);
		linkedList.AddNode2(node4);
		linkedList.AddNode2(node2);
		linkedList.show();
		
		System.out.println("------------");
		linkedList.remove(node1);
		linkedList.show();
	}

结果:
Node [number=1, name=宋江, nickName=及时雨]
Node [number=2, name=卢俊义, nickName=玉麒麟]
Node [number=3, name=吴用, nickName=智多星]
Node [number=4, name=林冲, nickName=豹子头]


Node [number=2, name=卢俊义, nickName=玉麒麟]
Node [number=3, name=吴用, nickName=智多星]
Node [number=4, name=林冲, nickName=豹子头]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的男女比例。 男女比例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值