链表---单向链表之添加节点(是否根据节点的顺序添加)

链表是以节点的方式来存储数据,即链式存储。
每个节点包含data域、next域。
链表的各个节点不一定都是连续存放。
链表分带头结点的链表和没有头结点的链表,根据实际需求来确定。
头结点:不存放具体的数据,用于表示单链表的头。

以三国人物简单示范,每个人物对象是一个节点。

添加节点(不考虑节点的顺序,按照节点的添加顺序进行存储)
步骤思路:
1.先创建一个head头结点,表示单链表的头
2.每添加一个节点,就直接加入到节点的最后
遍历:通过一个辅助变量,帮助遍历整个链表

代码如下:

public class SingleLinkedListDemo {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	//测试
	//先创建节点
	HeroNode hero1 = new HeroNode(1,"诸葛亮","小诸");
	HeroNode hero2 = new HeroNode(2,"黄月英","小黄");
	HeroNode hero3 = new HeroNode(3,"吕布","小吕");
	HeroNode hero4 = new HeroNode(4,"董卓","小董");
	
	//创建单向链表
	SingleLinkedList singleLinkedList = new SingleLinkedList();
	//加入节点
	singleLinkedList.add(hero1);
	singleLinkedList.add(hero2);
	singleLinkedList.add(hero3);
	singleLinkedList.add(hero4);
	//显示数据
	singleLinkedList.list();
}

}
//定义SingleLinkedList  管理英雄
class SingleLinkedList{
	//先初始化一个头结点,头结点不动
	private HeroNode head = new HeroNode(0,"","");

//添加节点到单向链表
/*
 * 思路:(不考虑编号顺序,按节点添加顺序)
 * 1.找到当前链表的最后节点
 * 2.将最后这个节点的next指向新的节点
 */
public void add(HeroNode heroNode) {
	//因为head节点不能动,所以需要一个辅助遍历temp
	HeroNode temp = head;
	//遍历链表,找到最后
	while(true) {
		//找到链表的最后
		if(temp.next == null) {
			break;
		}
		//如果没有找到最后,则将temp后移
		temp = temp.next;
	}
	//当退出while循环时,temp就指向了链表的最后
	//将最后这个节点的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 = 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;
	}
	//重写toString
	@Override
	public String toString() {
		return "HeroNode [no = "+no+",name = "+name+",nick = "+nickname+"]";
	}
}

添加节点(考虑节点的顺序,按照节点的大小顺序进行排列存储)
1.先通过辅助变量temp(指针)找到新添加的节点的位置(可以通过遍历来查找)
2.新的节点.next = temp.next;
3.temp.next = 新的节点;

代码如下:
//通过节点的编号顺序来插入节点,将节点插入到指定位置(单链表是一个已排好序的链表)
//如果这个节点的编号已经存在,则插入失败,并提示失败信息

public void addByOrder(HeroNode heroNode) {
	//因为头结点不能动,仍然需要一个辅助指针(变量)来帮助找到添加的位置
	//因为是单链表,所以找的temp应该是位于插入位置的前一个节点,否则插入不进去
	HeroNode temp = head;
	boolean flag = false;//标志添加的编号是否存在,默认为false
	while(true) {
		if(temp.next == null) {
			//说明temp已经在链表的最后
			break;
		}
		if(temp.next.no > heroNode.no) {
			//说明位置找到,就在temp后插入
			break;
		}else if(temp.next.no == heroNode.no) {
			//说明想要添加的heroNode的编号已经存在
			flag = true;//说明编号存在
			break;
		}
		temp = temp.next;//后移
	}
	//判断flag的值
	if(flag) {
		//说明编号存在,不能添加
		System.out.printf("准备插入的节点的编号%d已经存在,不能加入\n",heroNode.no);
	}else {
		//插入到链表中,temp后面
		heroNode.next = temp.next;
		temp.next = heroNode;
	}
}

//测试方法(在main函数中加入即可)

//按照节点的编号顺序来插入节点
		singleLinkedList.addByOrder(hero1);
		singleLinkedList.addByOrder(hero4);
		singleLinkedList.addByOrder(hero3);
		singleLinkedList.addByOrder(hero2);
		//显示数据
		singleLinkedList.list();
发布了40 篇原创文章 · 获赞 2 · 访问量 3415

猜你喜欢

转载自blog.csdn.net/BEYONDmonster/article/details/100111379