java链表的增删改查,取中间值,是否成环,反转,截取

本文详细介绍了如何使用Java实现单向链表的数据结构,包括创建链表Node类,设计LinkList管理类以执行增删改查操作,检查链表中是否存在环,找到链表的中间值,以及如何反转链表。通过测试类进行验证,展示了具体的操作和输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单向链表:

每个节点分为value区域和next区域,value是自己的值,next区域是下一个节点的地址

链表Node类:

package node;

public class Node {
	Integer val;//定义一个节点的值
	Node next;//定义下一个节点的地址,我们这个地方需要和我们的类名相同,只有这样我们才能记录下一个节点的地址。
	public Node(Integer val) {
		this.val = val;
	}
}

链表管理类LinkList,实现增删改查

package node;

public class LinkList {
	//定义链表的头结点
	Node head = null;//主要目的:记录头结点的位置
	
	//尾插法:链表的尾部插入数据
	public void insert(int val) {
		//创建节点
		Node node = new Node(val);
		//判断头记录是否为空
		if (head == null) {
			head = node;
			return;
		}
		
		//定义指针
		Node indexNode = head;
		//进行变量
		while (indexNode.next !=null) {
			indexNode = indexNode.next;
		}
		indexNode.next = node;
	}
	
	//头插法
	public void HeadInsert(int val) {
		//创建节点
		Node node = new Node(val);
		//判断头记录是否为空
		if (head == null) {
			head = node;
			return;
		}
		node.next = head;
		head = node;
	}
	
	//输出遍历
	public void printLink() {
		Node indexNode = head;
		while (indexNode !=null) {
			System.out.println(indexNode.val);
			indexNode = indexNode.next;
		}
	}
	
	//输出链表长度
	public int GetLength() {
		int length = 0;
		Node indexNode = head;
		while (indexNode!=null) {
			length++;
			indexNode = indexNode.next;
		}
		return length;
	}
	
	//查询某个值是否在链表中
	public boolean contains(int val) {
		Node  indexNode = head;
		while (indexNode!=null) {
			if (indexNode.val == val) {
				return true;
			}
			indexNode = indexNode.next;
		}
		return false;
	}
	
	//位置插入
	public void addNodeAtIndex(int val,int index) {
		if(index == 0) {
			HeadInsert(val);
		}else if(index == GetLength()){
			insert(val);
		}else {
			//插入在中间某个位置
			//1.新建插入的节点
			Node node = new Node(val);
			//2.定义游标遍历链表
			Node indexNode = head;
			Node tempNode = null;//indexNode上一个位置
			int position = 0;//位置
			while (indexNode!=null) {
				if (position == index) {
					node.next = indexNode;
					tempNode.next = node;
					return;
				}
				tempNode = indexNode;
				indexNode = indexNode.next;
				position++;
			}
		}
	}
	//位置删除
	public void removeNodeAtIndex(int index) {
		
		Node proNode = head;//要删除位置的前一个节点
		
		if (index<1) {//不删除节点
			return;
		}
		
		if (index==1) {//删除第一个节点
			head = head.next;
			return;
		}
		
		while (index-->2) {//使Pronode指向第index个结点前面的一个节点
			proNode = proNode.next;
		}
		proNode.next = proNode.next.next;//通过跳过结点来实现删除结点的效果
		return;
	}
}

测试类Test:

package node;

public class Test {
	public static void main(String[] args) {
		LinkList linkList = new LinkList();
		linkList.insert(5);
		linkList.insert(7);
		linkList.HeadInsert(4);
		linkList.HeadInsert(2);
		linkList.HeadInsert(3);
		linkList.printLink();
		System.out.println("--------------");
		System.out.println("反转:");
		linkList.fanzhuan();
		linkList.printLink();
		System.out.println("--------------");
		System.out.println("查询中间值");
		Node node = linkList.findMid();
		System.out.println(node.val);
		System.out.println("--------------");
		System.out.println("删除第二个值:");
		linkList.removeNodeAtIndex(2);
		linkList.printLink();
		System.out.println("--------------");
		linkList.NthFromEnd(2);
		linkList.printLink();
	}
}

输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值