Java单链表的实现 -- 数据结构的学习

单链表

package algorithm.linkedlist;

//测试用类
public class SingleLinkedListDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		初始化
		SingleLinkedList list = new SingleLinkedList();
		HeroNode node1 = new HeroNode(1, "孙悟空", "大师兄");
		HeroNode node2 = new HeroNode(2, "猪八戒", "二师兄");
		HeroNode node3 = new HeroNode(3, "沙悟净", "三师兄");
		HeroNode node4 = new HeroNode(4, "敖烈", "小白龙");
		// 无序添加
//		linekList.add(node1);
//		linekList.add(node4);
//		linekList.add(node2);
//		linekList.add(node3);
//		linekList.list();
		// 有序添加
		// HeroNode deleteNo = list.deleteByNo(12);未找到或空链表均抛出异常
		list.addByOrder(node3);
		list.addByOrder(node1);
		list.addByOrder(node4);
		list.addByOrder(node2);
		list.list();
		// 修改
		System.out.println("--------------修改后-------------");
		list.update(new HeroNode(3, "牛魔王", "孙悟空兄弟~~"));
		list.list();
		list.update(new HeroNode(32, "牛魔王", "孙悟空兄弟~~"));
		// 删除
		System.out.println("---------------删除节点-------------");
		HeroNode deleteByNo = list.deleteByNo(1);
		list.deleteByNo(4);
//		System.out.println("删除了" + deleteByNo.name + "节点");
//		HeroNode deleteNode = list.deleteByNo(12);未找到或空链表均抛出异常
//		System.out.println("删除了"+deleteNode.name+"节点");
		list.list();
		System.out.println("----------------查找------------------");
		HeroNode findByNo = list.findByNo(3);
		System.out.println("找到" + findByNo.name + "节点");
//		HeroNode findNo = list.findByNo(35);
//		System.out.println("找到" + findNo.name + "节点");
	}

}

//单链表
//思路:包含头结点的链表,需要有增删改查的操作
class SingleLinkedList {
	// 头结点 不含数据,含next
	private HeroNode head = new HeroNode(0, "头节点", "");
	//提供头结点的get()
	public HeroNode getHead() {
		return head;
	}
	
	public void setHead(HeroNode head) {
		this.head = head;
	}
	// 显示单链表【遍历】
	public void list() {
		// 链表为空
		if (head.next == null) {
			System.out.println("空链表");
			return;
		}
		HeroNode temp = head.next;// 第一个节点
		while (true) {
			// 遍历到最后
			if (temp == null) {// 注意此处不是temp.next==null,否则导致丢失最后一个节点
				break;
			}
			System.out.println(temp);
			// 指针后移
			temp = temp.next;
		}
		/*while(temp != null) {
			System.out.println(temp);
			temp = temp.next;
		}*/
	}
	// 增加操作(无序)
	// 思路: 传来的节点添加到最后一个节点(next=null)后,需要遍历
	public void add(HeroNode node) {
		// 用临时指针指向遍历中的节点
		HeroNode temp = head;// temp指向头节点
		// 遍历
		while (true) {
			if (temp.next == null) {// 遍历到最后
//				temp.next = node;//添加节点
				break;
			}
			// 指针后移
			temp = temp.next;
		}
		// 在遍历之后添加,不要再遍历期间添加,虽然同样可以实现,但影响有序添加时的思路
		temp.next = node;// 添加节点
	}

	// 增加操作(有序)
	// 思路:比较no的值,进行顺序插入 (小--大)
	// 1.遍历 2.找到比no大的节点的前一个节点(node)插入,插入节点.next = node.next node.next = 插入节点

	public void addByOrder(HeroNode node) {
		HeroNode temp = head;
		boolean flag = false;// 标志添加的节点的值是否存在 默认 不存在
		while (true) {
			if (temp.next == null) {// 到达链尾
				break;
			}
			if (temp.next.no > node.no) {// 找到比no大的节点
				break;
			} else if (temp.next.no == node.no) {
//				System.out.printf("插入的节点的no=%d已存在",node.no);
				flag = true;
				break;
			}
			// 指针后移,遍历
			temp = temp.next;
		}
		if (flag) {
			// 存在该值
			System.out.printf("插入的节点的no=%d已存在", node.no);
		} else {
			// 不存在,添加
			node.next = temp.next;
			temp.next = node;
		}
	}

	// 修改
	// 通过no查找,但不能修改no
	public void update(HeroNode node) {
		// 链表为空
		if (head.next == null) {
			System.out.println("空链表");
			return;
		}
		HeroNode temp = head;
		boolean flag = false;// 是否找到该节点
		while (true) {
			if (temp.next == null) {// 遍历到链尾
				break;
			}
			if (temp.no == node.no) {// 找到
				flag = true;
				break;
			}
			// 指针后移,遍历
			temp = temp.next;
		}
		if (flag) {// 找到修改的节点,修改
			temp.name = node.name;
			temp.nickName = node.nickName;
		} else {
			System.out.printf("没找到%d的节点信息\n", node.no);

		}
	}

	// 删除
	// 思路:遍历找到要删除的节点的前一个节点(node),node.next = node.next.next
	// jvm的GC会回收被删除的节点(对象无引用变成了垃圾)
	public HeroNode deleteByNo(int no) {

		// 链表为空
		if (head.next == null) {
			throw new RuntimeException("链表空");
		}
		HeroNode temp = head;// 定义指针
		boolean flag = false;// 是否找到
		while (true) {
			if (temp.next == null) {// 遍历到链尾
				break;
			}
			if (temp.next.no == no) {// 根据no找到要删除的节点,并找到要删除节点的前一个节点
				flag = true;
				break;
			}
			temp = temp.next;// 后移遍历
		}
		if (flag) {
			HeroNode val = temp.next;
			temp.next = temp.next.next;// 删除节点
			return val;
		} else {
			throw new RuntimeException("没找到" + no + "节点");
		}
	}

	// 查找
	public HeroNode findByNo(int no) {
		HeroNode temp = head.next;// 指针指向第一个节点
		while (true) {
			if (temp == null) {
				break;
			}
			if (temp.no == no) {
				return temp;
			}
			temp = temp.next;//遍历后移
		}
		throw new RuntimeException("未找到"+no+"节点");
	}
}

//节点
class HeroNode {
	int no; // 编号
	String name;// 名字
	String nickName;// 外号
	HeroNode next;// 下一节点

	// 构造器
	public HeroNode(int no, String name, String nickName) {
		this.no = no;
		this.name = name;
		this.nickName = nickName;
	}

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

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值