大家一起学数据结构之有序插入得单链表

今天要做个勤奋得小蜜蜂,更两篇。
单链表之有序插入单链表,以及单链表得修改与删除方法

下面来讲讲思路:怎么有序插入呢?其实也简单,咱们可以给节点加一个序号属性no,我们可以通过no得大小来给有序插入单链表。具体思路看代码吧
首先还是节点类

// 定义HeroNode ,每个HeroNode对象就是一个节点
class HeroNode2 {
	public int no;//序号
	public String name;
	public String nickName;
	public HeroNode2 next;//指向下一个节点

	public HeroNode2(int no, String name, String nickName) {
		this.no = no;
		this.name = name;
		this.nickName = nickName;
	}

	// 为了显示,重写toString
	@Override
	public String toString() {
		return "HeroNode2 [no=" + no + ", name=" + name + ", nickName=" + nickName + "]";
	}

}

接下来就是有序添加得部分啦,思路就是,因为头结点所一我们定义一个辅助我们遍历得节点temp,首先将头结点赋给temp,每次添加节点时我们先遍历链表,当temp.next.no >要插入节点.no我们就先把要插入节点.next指向temp.next,再把该节点插入到temp后面将temp.next指向要插入得节点。具体思路看代码

// 定义singleLinkedList链表,管理英雄节点
class SingleLinkedList2 {
	// 初始化头节点,不存放任何数据
	private HeroNode2 head = new HeroNode2(0, "", "");
/**
	 * 添加节点到单链表 需要考虑编号有序。
	 * 
	 * @param heroNode
	 */
	public void addNode(HeroNode2 heroNode) {
		// 因为head节点不能动,因此我们需要一个辅助遍历temp
		HeroNode2 temp = head;

		// 因为是单链表,所以我们找的temp是位于添加位置的前一个节点,否则插入失败
		boolean flag = false;// 判断编号在链表中是否存在

		// 遍历链表,来找位置
		while (true) {

			// 说明temp已经在链表最后
			if (temp.next == null) {
				break;
			}
			if (temp.next.no > heroNode.no) {
			// temp后一个节点的no>heroNode节点的no
				// 位置找到
				break;
			} else if (temp.next.no == heroNode.no) {
				System.out.println("********" + heroNode.no);
				flag = true;// 编号已经存在
				break;
			}
			temp = temp.next;
		}

		// 判断flag值,插入节点
		if (flag) {
			System.out.println("准备插入的英雄的编号" + heroNode.no + "已经存在");
		} else {

			// 在temp后面插入
			heroNode.next = temp.next;
			temp.next = heroNode;
		}

	}
}

下面时删除节点和修改节点得方法比较简单我就不细讲了

// 删除节点
	public void deleteNode(int no) {
		HeroNode2 temp = head;
		while (true) {
			if (temp.next == null) {
				System.out.println("链表遍历结束,没有该节点");
				break;
			}
			if (no == temp.next.no) {
				// 照到要删除节点,并且将指针指向其后一个节点,这样子该节点不会有其它引用指向
				// 会被垃圾回收机制回收
				temp.next = temp.next.next;
				break;
			}
			temp = temp.next;
		}
	}

// 修改节点信息,更具编号no修改,no不可变
	public void modifyNode(HeroNode2 node) {
		if (head.next == null) {
			System.out.println("链表为空");
			return;
		}

		// 更具no找到要修改的节点
		HeroNode2 temp = head;
		while (true) {
			if (temp.next == null) {
				System.out.println("链表已经遍历结束,没有该节点" + node.no);
				break;
			}
			if (temp.no == node.no) {

				// 已经找到要修改的节点
				temp.nickName = node.nickName;
				temp.name = node.name;
				break;
			}

			// 指针后移
			temp = temp.next;
		}
	}

有序插入就讲完了,下期讲下关于单链表得一些面试题。

展开阅读全文

Windows版YOLOv4目标检测实战:训练自己的数据集

04-26
©️2020 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值