链表 Linked List (单链表)

单链表 SingleLinkedList

  1. 链表是以节点的方式来存储
  2. 每个节点包含data域, next域: 指向下一个节点.
  3. 如图:发现链表的各个节点不一定是连续存储.
  4. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定

一个数据当中需要包含head和next。
在这里插入图片描述
添加(创建)
1.先创建一个head头节点,作用就是表示单链表的头
2.后面我们每添加一个节点,就直接加入到链表的最后
遍历:
1.通过一个辅助遍历,帮助遍历整个链表

代码实现:
首先创建一个class节点类:一个节点类当中包括了3个数据域和一个next指针,

class Node {
	public int no;
	public String name;
	public String head;
	public Node next;// 指向下一个数据结点
	public Node(int Hno, String Hname, String Hhead) {
		this.no = Hno;
		this.name = Hname;
		this.head = Hhead;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Node[no=" + no + ",name=" + name + ",head=" + head + "]";
	}
}

随后定义一个单链表的类SingleLinkedList:先初始化一个头节点,头节点不存放数据

private Node headnode = new Node(0,"","");

定义一个添加方法:不考虑no的排序,直接添加到最后,需要将链表进行遍历找到最后一个节点(最后一个节点的next指向null)

public void add( Node n) {
	//不考虑编号顺序,直接在最后一个添加,最后结点next指向传过来的节点
	Node temp = headnode ; //辅助变量,指向头节点
	while (true) {
		if (temp.next==null) {
			break;
		}
		temp=temp.next;
	}
	temp.next=n;
}

显示链表:

public void list() {
	//判断链表是否为空
	if (headnode.next==null) { //头节点的next指向null
		System.out.println("链表为空");
		return;
	}
	Node temp = headnode.next ; //辅助变量,
	while(true) {
		if (temp==null) {
			//遍历到最后,
			break;
		}
		//不为空,输出节点信息
		System.out.println(temp);
		//后移
		temp = temp.next;
	}
}

测试代码如下图:
在这里插入图片描述
在这里需要在添加节点的时候对数据的编号进行排序:
在这里插入图片描述

	public void addOrderBy(Node n) {
		// temp是所要添加节点的前一个位置的节点
		Node temp = headnode;
		boolean b = false;// 判断编号是否已经存在
		while (true) {
			if (temp.next == null) { // 节点的next值为null,表示找到最后一个节点
				break;
			}
			if (temp.next.no > n.no) {
				// 当节点的编号值大于这个添加的节点的编号,找到的前一个位置就是需要插入的位置
				break;
			} else if (temp.next.no == n.no) {
				// 编号相等表示编号已经存在
				b = true;
				break;
			}
			// 后移辅助节点用于循环遍历
			temp = temp.next;
		}
		if (b) {
			System.out.println("该编号已存在,编号为:" + n.no);
		}else {
			//插入到temp后面
			n.next=temp.next;
			temp.next=n;
		}
	}

测试如下:使用这个方法,在添加的时候可以看到添加的节点是不安顺序添加的,但是在最后的输出还是会按照no大小进行的排序,以及如果有重复的编号是不会被添加进去的。
在这里插入图片描述
修改链表节点的信息,根据编号修改:
在这里插入图片描述

public void update(Node n) {
		// 判断是否为空
		if (headnode.next == null) {
			System.out.println("链表为空");
			return;
		}
		// 找到要修改的节点
		Node temp = headnode.next;
		boolean b = false;// 判断找到这个编号节点
		while (true) {
			if (temp.next == null) { // 遍历到最后一个节点
				break;
			}
			if (temp.no == n.no) {
				// 找到了这个节点
				b = true;
				break;
			}
			// temp后移继续遍历
			temp = temp.next;
		}
		if (b) {
			// 修改值
			temp.name = n.name;
			temp.head = n.head;
		} else {
			System.out.println("没有这个编号:" + n.no);
		}
	}

测试代码如下:
在这里插入图片描述
删除元素节点:
在这里插入图片描述
方法代码如下:

// 删除节点,找到要删除的节点的前一个节点
	public void delete(int n) {
		Node temp = headnode;
		boolean b = false;// 是否找到这个n
		while (true) {
			if (temp.next == null) {// 遍历完成后跳出循环
				break;
			}
			if (temp.next.no == n) {// 找到了这个要删除的节点
				b = true;
				break;
			}
			temp = temp.next; // 往下继续遍历
		}
		if (b) {
			// 找到后直接进行跳过这个节点,指向下一个节点即表示删除这个节点
			temp.next = temp.next.next;
		} else {
			System.out.println("节点不存在:" + n);
		}
	}

测试代码及效果如下图:
在这里插入图片描述
最后分享一条文案:

人们争先恐后的挤向大城市,
却忘了在小城镇里也能做一个有灵魂的人。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Modify_QmQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值