java数据结构与算法——链表(单链表)

java数据结构与算法——链表(单链表)

链表(Linked List)的介绍:

链表的是有序的列表,但是它的内存中的存储如下图所示
java数据结构与算法——链表(单链表)_第1张图片
小结上图:
1)链表是以节点的方式来存储的,是链式存储
2)每个节点包含data域,next域:指向下一个节点
3)如图:发现链表的各个节点不一定是连续存储
4)链表分带头节点的链表和没有带头节点的链表

单链表(带头节点的链表)逻辑结构示意图如下

java数据结构与算法——链表(单链表)_第2张图片

以下实现单链表的增删改操作
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 singleLinkedList = new SingleLinkedList();

		System.out.println("---------------------添加---------------------");
		singleLinkedList.add(hero1);
		singleLinkedList.inser(hero2);
		singleLinkedList.add(hero3);

		singleLinkedList.list();

		// 插入
		System.out.println("---------------------插入---------------------");
		singleLinkedList.inser(hero4);

		singleLinkedList.list();
		// 修改
		HeroNode newHeroNode = new HeroNode(2, "小卢", "玉麒麟~~");
		singleLinkedList.update(newHeroNode);
		System.out.println("---------------------修改---------------------");
		singleLinkedList.list();

		// 删除
		singleLinkedList.del(1);
		singleLinkedList.del(4);
		System.out.println("---------------------删除---------------------");
		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 inser(HeroNode heroNode) {
		// 因为头节点不能动,因此我们任然需要一个辅助变量来帮助找到插入位置
		// 因为单链表,因为我们找的temp是位于添加位置的前一个节点,否则插入不了
		HeroNode temp = head;
		boolean flag = false;// 标记插入的编号已经存在
		while (true) {
			if (temp.next == null) {// 表示遍历到最后
				break;
			}
			if (temp.next.no > heroNode.no) {// 位置找到,就在temp的后面插入
				break;
			} else if (temp.next.no == heroNode.no) {// 说明哇哦插入的位置编号已经存在
				flag = true;
				break;
			}
			temp = temp.next;// 后移,遍历当前链表
		}
		if (flag) {
			System.out.println("准备插入的英雄编号" + heroNode.no + "已经存在");
		} else {
			// 插入到链表中,temp的后面
			heroNode.next = temp.next;
			temp.next = heroNode;
		}
	}

	// 修改节点的信息,根据no编号来修改,no不能改
	public void update(HeroNode newHeroNode) {
		// 判断是否为空
		if (head.next == null) {
			System.out.println("链表为空");
			return;
		}
		// 找到需要修改的节点,根据no编号
		// 定义一个辅助变量
		HeroNode temp = head.next;
		boolean flag = false;// 表示找到改节点
		while (true) {
			// 判断是否遍历完
			if (temp == null) {
				break;
			}
			if (temp.no == newHeroNode.no) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if (flag) {
			temp.name = newHeroNode.name;
			temp.nickname = newHeroNode.nickname;
		} else {
			System.out.println("没有找到编号" + newHeroNode.no + "的节点,不能修改");
		}
	}

	// 删除节点
	// 思路
	// 1.head不能动,因此我们需要一个temp辅助节点找到删除节点的前一个节点
	// 2.说明我们在比较少,是temp.nest.no和需要删除的节点no比较
	public void del(int no) {

		HeroNode temp = head;

		boolean flag = false;// 标志是否找到要删除的节点
		while (true) {
			if (temp.next == null) {// 表示已经遍历完
				break;
			}
			if (temp.next.no == no) {// 找到的待删除节点的前一个节点temp
				flag = true;
				break;

			}
			temp = temp.next;
		}
		if (flag) {
			temp.next = temp.next.next;// 删除节点的前一个节点的next要指向删除节点的后一个节点
		} else {
			System.out.println("要删除的" + no + "节点不存在");
		}
	}

	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;
	}

	@Override
	public String toString() {
		return "no=" + no + ", name=" + name + ", nickname=" + nickname;
	}

}

你可能感兴趣的:(java数据结构与算法——链表(单链表))