编写链表以及增、删、改、查、逆序

基本概念

我的理解就是这个链表就像是几个人手拉手,我们只知道第一个认识谁,只能通过上一个拉手的人,才能知道这个是谁。

注 Node 里面存放的是 你存放的值的地址,只有修改在class Node里面被赋值的 Node 类型 的值才算是修改链表,其他任何在这之外赋值的,都只是被赋值,无法对链表起到任何作用

代码如下

class LinkedList1 {
	Node head;

	class Node {// 节点
		public String value = null;

		public Node next = null;

		public Node(String value) {
			super();
			this.value = value;
		}
	}

	public void add(String v) {// 链表的添加
		Node n = new Node(v);
		if (head == null) {
			head = n;
			return;
		}
		Node cun = head;
		while (cun.next != null) {
			cun = cun.next;
		}
		cun.next = n;
	}

	public int length() {// 链表的长度
		int i = 0;

		if (head != null) {
			i++;
		}
		Node cun = head.next;

		while (cun != null) {
			i++;
			cun = cun.next;
		}
		return i;
	}

	public void println() {// 遍历
		if (head.equals(null)) {
			System.out.println("还没存数据");
			return;
		}
		Node cun = head;
		while (cun != null) {
			System.out.println(cun.value);
			cun = cun.next;
		}
	}

	public void delete(String s) {// 链表的删除,删除所有等于 s 的值
		int i = 0;
		if (head == null) {
			System.out.println("还未存入数据");
			return;
		}
		boolean pd = false;// 判断是否进行过删除
		while ((head != null && head.value.equals(s))) {// 当第一个是要删除的值,删除之后,会在次循环判断是否这个首节点是否是要删除的
			if (head.next == null) {// 判断是否是进行到了最后一个节点
				head = null;
			} else {
				head = head.next;
			}
			pd = true;
		}

		Node cun = head;
		level: while (head != null && cun.next != null) {
			while (cun.next.value.equals(s) && cun.next != null) {
				pd = true;
				if (cun.next.next != null) {
					cun.next = cun.next.next;
				} else {
					cun.next = null;
					break level;
				}
			}
			cun = cun.next;
		}
		if (head != null) {
			System.out.println(pd ? "删除完成" : "未找到改数据");
		} else {
			System.out.println("数据已删完");
			return;
		}
		println();
	}

	public void remove(String s) {// 链表的移除第一个碰到的
		boolean pd = false;// 判断是否进行过删除
		if (head == null) {
			System.out.println("还未存入数据");
			return;
		}

		if (head.value.equals(s)) {// 判断是否是要删的值
			if (head.next == null) {// 判断是否是最后一个节点
				head = null;
			} else {
				head = head.next;
			}
			pd = true;
		}

		Node cun = head;
		while (cun.next != null) {
			if (cun.next.value.equals(s)) {
				pd = true;
				if (cun.next.next != null) {
					cun.next = cun.next.next;
					cun = cun.next;
				} else {
					cun.next = null;
				}
				break;
			}
			cun = cun.next;
		}
		if (head == null) {
			System.out.println("数据已删完");
		} else {
			System.out.println(pd ? "删除完成" : "未找到改数据");
			println();
		}
	}

	public void Reverse() {// 链表的逆序
		if (head == null) {
			System.out.println("暂无数据");
		}

		Node cun = head;
		Node tmp = null;
		Node foot = null;
		Node rnext = null;

		while (cun != null) {// 这个节点 指的是 循环到的节点

			rnext = cun.next;// 这个节点的下一个节点的地址赋值给rnext
			cun.next = tmp;// 这个节点的下一个节点 被 tmp 赋值
			tmp = cun; // 这个节点的地址赋值给 tmp 通过循环传递,成为下一个循环的上一个节点的地址
			cun = rnext;// 这个节点的下一个节点的地址赋值给这一个节点,并通过循环传递成为下一个循环的这个节点

			if (cun == null) {// 当这个循环进行到最后,这个节点为空时, 第一个节点 被 赋值
				head = tmp;
			}

		}
		System.out.println("逆序完成:");
		println();
	}
	
	public void modify(int index, String s){
		
		if(index < 1 || index > length()){
			System.out.println("修改的的位置错误");
			return;
		}
		
		int max = length();
		
		Node cun = head;
		for(int i = 1; i <= max; i++){
			if(i == index){
				cun.value = s;
				break;
			}
			cun = cun.next;
		}
		System.out.println("修改如下:");
		println();
	}

	public String get(int index){//查询
		if(index < 1 || index > length()){
			System.out.println("该位置错误");
			return null;
		}
		
		int max = length();
		
		Node cun = head;
		for(int i = 1; i <= max; i++){
			if(i == index){
				return cun.value;
			}
			cun = cun.next;
		}
		return null;
	}
	
}

public class Demo02 {
	public static void main(String[] args) {
		LinkedList1 l = new LinkedList1();
		l.add("1");
		l.add("2");
		l.add("3");
		l.add("4");
		l.add("5");
		l.println();
		System.out.println();
		l.Reverse();
		System.out.println();
		System.out.println(l.length());
		System.out.println();
		l.remove("1");
		l.modify(2, "9");
		System.out.println("查询的值:"+l.get(3));
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值