链表的一系列操作(内附源码,学习网站)

目录

 

学习了链表的一系列操作

1. 链表的结构

2. 链表的操作

2.1. 链表的创建

2.2. 链表的增加(包括顺序添加和有条件添加)

3. 测试


学习了链表的一系列操作

1. 链表的结构

  • data域
  • next域(指向下个节点)

2. 链表的操作

2.1. 链表的创建

  • 构建节点信息
class HeroNode{

	//data域
	private int no;
	private String name;
	private String nickName;
	//指向下个节点
	HeroNode next;
	
	//构造函数
	public HeroNode(int no,String name,String nickName) {
		this.no = no;
		this.name = name;
		this.nickName = nickName;
	}

	
	public int getNo() {
		return no;
	}


	public void setNo(int no) {
		this.no = no;
	}


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public String getNickName() {
		return nickName;
	}


	public void setNickName(String nickName) {
		this.nickName = nickName;
	}


	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName + "]";
	}
}
  • 创建链表
class SingleLinkList{
	//构建头结点
	
	HeroNode headNode = new HeroNode(0, "", "");
    
}

SingleLinkList singleLinkList = new SingleLinkList();

2.2. 链表的增加(包括顺序添加和有条件添加)

1. 顺序添加

  • 思路:
直接找到链表尾部,插入即可(找到待插入的位置前一个节点,所以基本代码里基本都是temp.next)
  • 代码:
//添加节点(直接添加在链表尾部)
	public void add(HeroNode heroNode) {
		//判断是否为空
		if(headNode.next == null) {
			headNode.next = heroNode;
			return;
		}
		//遍历链表节点,找到最后一个节点,插入;
		//头节点不能动,所以新生成个变量,作为遍历节点的工具
		HeroNode temp = headNode;
		while(true) {
			if(temp.next == null) {//找到了,插入此位置
				temp.next = heroNode;
				break;
			}
			//没找到,继续遍历
			temp = temp.next;
		}
	}

2.有条件添加

  1. 思路:
找到待插入位置前一个节点temp
newNode.next = temp.next;
temp.next = newNode;
  1. 代码:
//添加节点(按照英雄排名,插入链表中)
public void addByOrder(HeroNode heroNode) {
	//因为头节点不能动,所以用变量temp代替它,找到待填入的位置
	HeroNode temp = headNode;
	boolean flage = false;//是否已经存在该英雄
	
	while(true) {
		if(temp.next==null) {//遍历到了最后一个节点,直接返回
			break;
		}
		if(temp.next.getNo()>heroNode.getNo()) {//找到待插入的位置
			break;		
		}else if (temp.next.getNo()==heroNode.getNo()) {//已经存在待插入的英雄
			flage = true;
			break;
		}
		temp = temp.next;
	}
	if(flage) {
		System.out.printf("标号为%d的节点已经存在,不能插入!\n",heroNode.getNo());
	}else {
		heroNode.next = temp.next;
		temp.next = heroNode;
	}
}

3. 删除节点

  1. 思路:
找到待删除节点的前一个节点temp
temp.next = temp.next.next
  1. 代码:
//删除节点
public void delete(int no) {
	if(headNode.next == null) {
		System.out.println("链表为空,不能删除!");
	}
	HeroNode temp = headNode;		
	boolean flage = false;
	while(true) {
		if(temp.next == null) {
			break;
		}
		if(temp.next.getNo() == no) {//找到了
			flage = true;
			break;
		}
		temp = temp.next;
	}
	if(flage) {
		temp.next = temp.next.next;
		System.out.printf("链表节点no为%d的节点成功被删除!\n",no);
	}else {
		System.out.printf("链表节点no为%d的节点未找到!\n",no);
	}
	
}

4.修改结点

  1. 思路:
找到待修改的节点
直接修改节点信息
  1. 代码:
//修改节点信息(no不能修改)
public void update(HeroNode newHeroNode) {
	//判空
	if(headNode.next == null) {
		System.out.println("链表为空,不能修改!");
		return;
	}
	//定义临时变量,作为遍历变量
	HeroNode temp = headNode.next;
	boolean flage = false;//是否找到待修改的节点
	while (true) {
		if(temp == null) {//遍历到链表尾
			break;
		}
		if(temp.getNo() == newHeroNode.getNo()) {
			flage = true;
			break;
		}
		temp = temp.next;			
	}
	if(flage) {
		temp.setName(newHeroNode.getName());
		temp.setNickName(newHeroNode.getNickName());
		System.out.printf("节点no为%d的节点修改成功!\n",newHeroNode.getNo());
	}else {
		System.out.printf("节点no为%d的节点修改失败!\n",newHeroNode.getNo());
	}
}

5. 显示链表信息

  1. 思路:
直接遍历链表
  1. 代码:
//展示所有节点信息
public void list() {
	if(headNode.next == null) {
		System.out.println("尚无节点!");
		return;
	}
	HeroNode temp = headNode.next;
	while (true) {
		if(temp == null) {
			break;
		}
		System.out.println(temp.toString());
		temp = temp.next;
	}
}

3. 测试

public static void main(String[] args) {
		// TODO Auto-generated method stub
		//案例1、宋江、吴用、林冲
		HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
		HeroNode heroNode2 = new HeroNode(2, "吴用", "智多星");
		HeroNode heroNode3 = new HeroNode(3, "林冲", "豹子头");
		HeroNode heroNode4 = new HeroNode(4, "宋江", "及时雨");
		HeroNode heroNode5 = new HeroNode(5, "吴用", "智多星");
		HeroNode heroNode6 = new HeroNode(6, "林冲", "豹子头");
		SingleLinkList singleLinkList = new SingleLinkList();
		//加入
//		singleLinkList.add(heroNode3);
//		singleLinkList.add(heroNode2);
//		singleLinkList.add(heroNode1);
		
		//按照顺序加入
		singleLinkList.addByOrder(heroNode3);
		singleLinkList.addByOrder(heroNode2);
		singleLinkList.addByOrder(heroNode1);
		singleLinkList.addByOrder(heroNode4);
		singleLinkList.addByOrder(heroNode6);
		singleLinkList.addByOrder(heroNode5);
		singleLinkList.addByOrder(heroNode5);
		singleLinkList.list();
		//修改链表
//	    HeroNode heroNode = new HeroNode(1, "宋江", "及时雨~");
//	    singleLinkList.update(heroNode);
//	    singleLinkList.list();
		//删除链表节点
		singleLinkList.delete(1);
		singleLinkList.delete(1);
		singleLinkList.list();

	}

学习网站:https://www.bilibili.com/video/BV1E4411H73v?p=21

附件:完整代码

package LinkList;

import javax.lang.model.element.NestingKind;

public class SingleLinkListDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//案例1、宋江、吴用、林冲
		HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
		HeroNode heroNode2 = new HeroNode(2, "吴用", "智多星");
		HeroNode heroNode3 = new HeroNode(3, "林冲", "豹子头");
		HeroNode heroNode4 = new HeroNode(4, "宋江", "及时雨");
		HeroNode heroNode5 = new HeroNode(5, "吴用", "智多星");
		HeroNode heroNode6 = new HeroNode(6, "林冲", "豹子头");
		SingleLinkList singleLinkList = new SingleLinkList();
		//加入
//		singleLinkList.add(heroNode3);
//		singleLinkList.add(heroNode2);
//		singleLinkList.add(heroNode1);
		
		//按照顺序加入
		singleLinkList.addByOrder(heroNode3);
		singleLinkList.addByOrder(heroNode2);
		singleLinkList.addByOrder(heroNode1);
		singleLinkList.addByOrder(heroNode4);
		singleLinkList.addByOrder(heroNode6);
		singleLinkList.addByOrder(heroNode5);
		singleLinkList.addByOrder(heroNode5);
		singleLinkList.list();
		//修改链表
//	    HeroNode heroNode = new HeroNode(1, "宋江", "及时雨~");
//	    singleLinkList.update(heroNode);
//	    singleLinkList.list();
		//删除链表节点
		singleLinkList.delete(1);
		singleLinkList.delete(1);
		singleLinkList.list();

	}
	
	

}
class SingleLinkList{
	//构建头结点
	HeroNode headNode = new HeroNode(0, "", "");
	
	//添加节点(直接添加在链表尾部)
	public void add(HeroNode heroNode) {
		//判断是否为空
		if(headNode.next == null) {
			headNode.next = heroNode;
			return;
		}
		//遍历链表节点,找到最后一个节点,插入;
		//头节点不能动,所以新生成个变量,作为遍历节点的工具
		HeroNode temp = headNode;
		while(true) {
			if(temp.next == null) {//找到了,插入此位置
				temp.next = heroNode;
				break;
			}
			//没找到,继续遍历
			temp = temp.next;
		}
	}
	
	
	//添加节点(按照英雄排名,插入链表中)
	public void addByOrder(HeroNode heroNode) {
		//因为头节点不能动,所以用变量temp代替它,找到待填入的位置
		HeroNode temp = headNode;
		boolean flage = false;//是否已经存在该英雄
		
		while(true) {
			if(temp.next==null) {//遍历到了最后一个节点,直接返回
				break;
			}
			if(temp.next.getNo()>heroNode.getNo()) {//找到待插入的位置
				break;		
			}else if (temp.next.getNo()==heroNode.getNo()) {//已经存在待插入的英雄
				flage = true;
				break;
			}
			temp = temp.next;
		}
		if(flage) {
			System.out.printf("标号为%d的节点已经存在,不能插入!\n",heroNode.getNo());
		}else {
			heroNode.next = temp.next;
			temp.next = heroNode;
		}
	}
	
	//修改节点信息(no不能修改)
	public void update(HeroNode newHeroNode) {
		//判空
		if(headNode.next == null) {
			System.out.println("链表为空,不能修改!");
			return;
		}
		//定义临时变量,作为遍历变量
		HeroNode temp = headNode.next;
		boolean flage = false;//是否找到待修改的节点
		while (true) {
			if(temp == null) {//遍历到链表尾
				break;
			}
			if(temp.getNo() == newHeroNode.getNo()) {
				flage = true;
				break;
			}
			temp = temp.next;			
		}
		if(flage) {
			temp.setName(newHeroNode.getName());
			temp.setNickName(newHeroNode.getNickName());
			System.out.printf("节点no为%d的节点修改成功!\n",newHeroNode.getNo());
		}else {
			System.out.printf("节点no为%d的节点修改失败!\n",newHeroNode.getNo());
		}
	}
	
	//删除节点
	public void delete(int no) {
		if(headNode.next == null) {
			System.out.println("链表为空,不能删除!");
		}
		HeroNode temp = headNode;		
		boolean flage = false;
		while(true) {
			if(temp.next == null) {
				break;
			}
			if(temp.next.getNo() == no) {//找到了
				flage = true;
				break;
			}
			temp = temp.next;
		}
		if(flage) {
			temp.next = temp.next.next;
			System.out.printf("链表节点no为%d的节点成功被删除!\n",no);
		}else {
			System.out.printf("链表节点no为%d的节点未找到!\n",no);
		}
		
	}
	
	//展示所有节点信息
	public void list() {
		if(headNode.next == null) {
			System.out.println("尚无节点!");
			return;
		}
		HeroNode temp = headNode.next;
		while (true) {
			if(temp == null) {
				break;
			}
			System.out.println(temp.toString());
			temp = temp.next;
		}
	}
	
}


//构建英雄节点
class HeroNode{
	//data域
	private int no;
	private String name;
	private String nickName;
	//指向下个节点
	HeroNode next;
	
	//构造函数
	public HeroNode(int no,String name,String nickName) {
		this.no = no;
		this.name = name;
		this.nickName = nickName;
	}

	
	public int getNo() {
		return no;
	}


	public void setNo(int no) {
		this.no = no;
	}


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public String getNickName() {
		return nickName;
	}


	public void setNickName(String nickName) {
		this.nickName = nickName;
	}


	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName + "]";
	}
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值