单链表的基本操作一 (Java)

java数据结构实验实验一、单链表的基本操作源码实现 **实验一、单链表的基本操作 山东建筑大学网络工程121班马琳源码都是自己所做,只供学习用, 一、实验目的 1、掌握线性链表的操作特点,即指针是逻辑关系的映像。 2、掌握动态产生单链表的方法。 3、熟练掌握单链表的插入、删除操作特点,即指针赋值的先后次序。 4、熟练掌握单链表的取元素操作 二、实验内容 1、定义单链表类型并动态创建单链表; 2、实现单链表的取元素操作、插入操作和删除 阅读详情

单链表的基本操作一

1. 单链表的反转

2.判断两个链表是否相交

public class LinkList {
	
	/**
	 * 单链表的反转
	 */
	public static Node reverseList(Node head) {
		if (head == null) {
			return null;
		}
		if (head.getNext() == null) {
			return null;
		}
		
		Node pNode = head.getNext();
		Node qNode = null;
		head.setNext(qNode);
		qNode = head;
		while(pNode != null) {
			Node tmp = pNode.getNext();
			pNode.setNext(qNode);
			qNode = pNode;
			pNode = tmp;
		}
		head = qNode;
		return head;
	}
	/**
	 * 遍历链表
	 */
	public static void printList(Node head) {
		while(head!=null) {
			System.out.print(head.getData());
			head = head.getNext();
		}
		System.out.println();
	}
	
	/**
	 * 判断单链表是否有环
	 * 快慢指针,快指针可以追上慢指针,有环
	 */
	public static Node hasCircle(Node head) {
		if (head == null) {
			return null;
		}
		Node fast, slow; //快慢指针
		slow = head.getNext();
		fast = head.getNext().getNext();
		while(fast != slow) {
			if (fast.getNext() == null || fast.getNext().getNext() ==null) {
				return null;//无环
			}
			fast = fast.getNext().getNext();
			slow = slow.getNext();
		}
		fast = head;
		while(slow != fast) {// 快指针从头开始扫描,慢指针继续遍历,第一次相遇的节点即为环的入口;
			fast = fast.getNext();
			slow = slow.getNext();
		}
		return fast;
	}
	
	
	/**
	 * 判断两个链表是否相交:
	 * 1. 链表都无环:
	 * * * * * 1.1 先判断链表的尾指针是否相同,若不同,未相交;
	 * * * * * 1.2 若相同,则相交,让两个链表从 距离尾节点相同距离的位置开始遍历
	 * * * * * 
	 * 2. 链表都有环 :
	 * * * * * 2.1 如果环的入口点相同,则判断方法同无环的判断方法,从距离换入口点相同距离的位置开始扫描两个链表;
	 * * * * * 2.2入口点不同:
	 */
	public static Node getFirstMeetNode(Node head1,Node head2) {
		Node n1 = hasCircle(head1);
		Node n2 = hasCircle(head2);
		
		if (n1 == null && n2 == null) {
			System.out.println(0);
			//两个链表都无环;
			return noCircleMeetNode(head1,head2);
		}
		
		if (n1 != null && n2 != null) {
			System.out.println(1);
			//两个链表都有环
			return hasCircleMeetNode(head1,n1,head2,n2);
		}
		
		return null;
	}
	
	/**
	 * 无环时,找相交点
	 */
	public static Node noCircleMeetNode(Node head1,Node head2) {
		
		if (head1 == null | head2 == null) { // 其中有一个为空链表,不相交
			return null;
		}
		
		Node p1 = head1,p2 = head2;
		int n = 0;
		while(p1.getNext()!=null) {
			n++;
			p1 = p1.getNext();
		}
		while(p2.getNext()!=null) {
			n--;
			p2 = p2.getNext();
		}
		
		if (p1 != p2) {
			return null; // 尾节点不相同,不相交
		}
		System.out.println("尾节点相同:"+p1.getData());
		if (n >0) {
			p1 = head1;
			while(n >0) {
				n --;
				p1 = p1.getNext();
			}
			p2 = head2 ;
			while(p1 != p2) {
				p1 = p1.getNext();
				p2 = p2.getNext();
			}
			return p1;
		}else{
			p2 = head2;
			while (n<0) {
				n++;
				p2 = p2.getNext();
			}
			p1 = head1;
			while( p1 != p2) {
				p1 = p1.getNext();
				p2 = p2.getNext();
			}
			return p1;
		}
		
	}
	
	/**
	 * 有环,找相交点
	 */
	public static Node hasCircleMeetNode(Node head1,Node n1,Node head2,Node n2) {
		Node p1 = null, p2 = null;
		if (n1 == n2) {
			System.out.println("入环点相同:"+ n1.getData());
			//入环点相同
			p1 = head1;
			p2 = head2;
			int n = 0;
			while(p1 != n1) {
				n++;
				p1 = p1.getNext();
			}
			while(p2 != n2) {
				n--;
				p2 = p2.getNext();
			}
			
			if (n >0) {
				p1 = head1;
				while(n >0) {
					n --;
					p1 = p1.getNext();
				}
				p2 = head2 ;
				while(p1 != p2) {
					p1 = p1.getNext();
					p2 = p2.getNext();
				}
				return p1;
			}else{
				p2 = head2;
				while (n<0) {
					n++;
					p2 = p2.getNext();
				}
				p1 = head1;
				while( p1 != p2) {
					p1 = p1.getNext();
					p2 = p2.getNext();
				}
				return p1;
			}
			
		}else {
			System.out.println("入环点不同:"+ n1.getData()+" "+n2.getData());
			p1 = n1.getNext();
			while(p1 != n1) {
				if (p1 == n2) {
					return n1;
				}
				p1 = p1.getNext();
			}
			
		}
		return null;
	}

    // 测试    
   public static void main(String[] args) {
		Node node1 = new Node(1);
		Node node2 = new Node(2);
		Node node3 = new Node(3);
		Node node4 = new Node(4);
		Node node5 = new Node(5);
		node1.setNext(node2);node2.setNext(node3);node3.setNext(node4);node4.setNext(node5);
		Node head = node1;
//		System.out.println("原始单链表");
//		printList(head);
		
//		System.out.println();
		
//		System.out.println("反转后的单链表");
//		Node newHead = reverseList(head);
//		printList(newHead);
		
//		System.out.println("判断单链表是否有环:");
		Node node6 = new Node(6); Node node7 = new Node(7);  Node node8 = new Node(8);
		node5.setNext(node6); node6.setNext(node7); node7.setNext(node8); //node8.setNext(node5);
		
		Node node0 = new Node(0);
		Node node9 = new Node(9);
		
		node0.setNext(node9); node9.setNext(node4); 
		// 0 9 7 8 5 6 7 
		
		System.out.println("list1是否有环:"+(hasCircle(head) == null ? null:hasCircle(head).getData()));
		System.out.println("list2是否有环:"+(hasCircle(node0) == null ? null:hasCircle(node0).getData()));
		//list1 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 >5 
		//list2 null
//		Node node = getFirstMeetNode(head,null);
//		System.out.println("链表的交点 :"+(node == null ? null : node.getData())); // null
		
//		node = getFirstMeetNode(null,null);
//		System.out.println("链表的交点 :"+(node == null ? null : node.getData())); // null
		
		//list2 0 > 9 > 7 > 8 > 5 > 6 > 7 
		
		
		Node node = getFirstMeetNode(head,node0);
		System.out.println("链表的交点 :"+(node == null ? null : node.getData()));
   }
	
	
}


class Node{
// 单链表的节点类
	private int data;//数据
	private Node next;//指向下一个数据的指针
	
	
	public Node(int data) {
		super();
		this.data = data;
	}
	public int getData() {
		return data;
	}
	public void setData(int data) {
		this.data = data;
	}
	public Node getNext() {
		return next;
	}
	public void setNext(Node next) {
		this.next = next;
	}
	
	
}

 

Java实现单链表的基本操作 立即下载

相关推荐

告别混乱!AutoSar BswM模式管理实战:手把手教你配置Rule与ActionList(附避坑指南)

本文详细解析了AutoSar BswM模式管理的实战配置,重点介绍了Rule与ActionList的高效组合方法,帮助开发者避免常见陷阱。通过具体案例演示了从基础到复杂的配置步骤,包括模式仲裁、逻辑表达式构建及ActionList优化策略,提升汽车电子系统的协调性与可靠性。

weixin_27066963的博客 258

Java~单链表基本操作图文详解_清晰易懂(超详细,含完整代码)

一.单链表的定义 1.结点的定义

Zebra的博客 3938

Python-OPCUA 实现西门子PLC数据批量读写与自动化监控

本文详细介绍了如何使用Python结合OPC UA协议,实现对西门子PLC数据的批量读写与自动化监控。通过搭建开发环境、利用KEPserverEX作为通信桥梁,并配合Python代码实战,读者可以掌握高效的数据采集、批量写入以及构建带报警功能的监控系统的方法,从而大幅提升工业自动化场景下的数据处理效率和系统灵活性。

www00的博客 181

算法通关村第一关—青铜挑战—用Java基本实现各种链表操作

算法链表是一种用于解决问题的数据结构,它包含了多个节点,每个节点都包含了一个值和一个指向下一个节点的指针。与数组不同,链表的节点在内存中不是连续存储的,而是通过指针链接在一起。 通过使用算法链表,可以实现各种常见的算法操作,如插入、删除、查找等。由于链表的特殊结构,插入和删除操作的时间复杂度为O(1),而查找操作的时间复杂度则为O(n)。 链表还可以用来解决一些特殊的问题,比如反转链表、判断链表是否存在环以及找到链表的中间节点等。这些问题在实际开发中经常会遇到,并且链表的特性使得解决方案变得相对简单。

itzzan的博客 475

数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案

数字IC后端实战项目案例之Innovus verify_drc DRC Violation脚本自动化修复方案

weixin_37584728的博客 4042

深入解析mSATA与mini-PCIE接口的硬件设计要点

本文深入解析mSATA与mini-PCIE接口的硬件设计要点,涵盖信号定义、电源设计、高速信号处理及PCB布局布线等关键内容。通过实战案例和调试技巧,帮助工程师规避常见设计陷阱,提升电路设计效率,特别适合工业控制和嵌入式系统开发场景。

weixin_28741413的博客 315

自己实现链表的基本操作方法(详细)(Java实现)

因为链表类也实现了线性表接口的方法,所以链表的基本操作方法和顺序表一样。这里我们定义链表中的元素类型为包装类(体现对象的形式而不是基本类型)这里提前定义了 MyNode 类,其中的属性为:Long val;三个属性,一个元素值 val ,一个指向前一个结点的引用 prev,一个指向后一个结点的引用 next。在 MyLinkedList 类(自定义链表类)中实现自定义基本方法,其中包括属性 MyNode head;int size;

AwwzJ_0821的博客 2778

Fiddler everywhere的一些基础操作

网上能搜到的Fiddler everywhere使用教程太少,于是我整理了一些自己实操成功的内容,包括Fiddler everywhere的Mock测试、弱网测试等基础操作,后续还会持续更新。操作系统:macOS使用工具:Fiddler everywhere 5.10.0本文简单介绍了使用Fiddler everywhere进行的Mock测试和弱网测试,而Fiddler everywhere提供了更多的其他实用的功能,我会在后期进行一个持续的学习和更新。

weixin_44346646的博客 2478

java数据结构单链表的基本操作

实验目的 1、掌握线性链表的操作特点,即指针是逻辑关系的映像。 2、掌握动态产生单链表的方法。 3、熟练掌握单链表的插入、删除操作特点,即指针赋值的先后次序。 4、熟练掌握单链表的取元素操作 实验内容 1、定义单链表类型并动态创建单链表; 2、实现单链表的取元素操作、插入操作和删除操作; 3、实现输出单链表中各元素值的操作; 4、将单链表中的最小元素移到最前面。 实验步骤 1、定义单链表节点类; ...

sticker_start_tag的博客 1691

详细解释xilinx源语的使用:IDELAYE2和IDELAYE3

/ 完整的数据位对齐模块input wire dqs, // 数据选通input wire [7:0] dq_in, // 8位数据输入output wire [63:0] data_out // 并行数据输出// 延迟控制信号// 每个数据位都需要独立的IDELAYgenvar i;i < 8;// IDELAYE2实例.IDELAY_VALUE (10), // 初始值。

baidu_34971492的博客 433

基于Java+SpringBoot+微信小程序实现奶茶点单系统

再不用担心逢年过节的第一杯奶茶有没有人送了,制作一个奶茶点单系统自己当店主,开怀畅饮,一劳永逸。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

单链表的基本操作(一)——Java语言

一、单链表的基本操作: (不带头节点的单链表) 创建一个包:把所有待实现的方法写在这个包下的一个接口中 package Test.listclass.impl; public interface ILinked { //头插法 void addFirst(int data); //尾插法 void addLast(int data); //任意位置插入,第...

weixin_44416545的博客 2090

【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码+数据集+原理介绍)

本专栏整理了《深度学习时间序列预测案例》,内包含了各种不同的基于深度学习模型的时间序列预测方法,例如LSTM、GRU、CNN(一维卷积、二维卷积)、LSTM-CNN、BiLSTM、Self-Attention、LSTM-Attention、Transformer等经典模型,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 4万+

Java单链表基本操作(一)--顺序查找

本系列博文,将围绕一下几个方面: Java单链表基本操作: (一)顺序查找; (二)指定位置增加节点; (三)删除当前节点; (四)单链表反转; (五)输出倒数第K个节点; (六)删除重复节点; (七)合并两个排序单链表; (八)交换相邻节点的值;本节讲述最基础的顺序查找,主要熟悉一下单链表的属性和基本操作。/* * 查找值为num的元素位置,没有返回-1*/ public cl

gaven的博客 7575

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java单链表基本操作 一,Java_实现单链表-基本操作

1 packageofficeCoding;23 importjava.util.ArrayList;4 importjava.util.Stack;56 /**7 * 从尾到头遍历链表 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList8 *9 *@authorAdministrator10 */11 class ListNode {//单链表节点构建12 intval;1...

weixin_35671421的博客 346

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【单链表】Java实现

1、什么是单链表 单链表是链表的其中一种基本结构。 一个最简单的结点结构如图所示,它是构成单链表的基本结点结构。 在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。 因为只有一个指针结点,称为单链表。 单链表中三个概念需要区分清楚:分别是头指针,头节点和首元节点。 头结点:有时,在链表的第一个结点之前会额外增设一个结点,结点的数据域一般不存放数据(有些情况下也可以存放链表的长度等信息),此结点被称为头结点。 若头结点的指针域为空(NULL),表明链表是空表。 头结点对于链表来说,

gaofeng的博客 463

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构(3)—单链表专题

单链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含两部分:一部分是存储数据的元素,另一部分是一个指向下一个节点的指针。单链表在内存中不是连续存储的,这使得它在插入和删除操作上比数组更灵活,但访问特定元素的速度比数组慢。单链表和数组是两种基本的线性数据结构,它们各自有不同的优势和适用场景。动态内存分配单链表可以在运行时动态地增加或减少节点,不需要在创建时就确定大小。这使得单链表在处理不确定数量的数据时更加灵活。数组的大小通常在声明时就固定了,虽然可以使用ArrayList。

weixin_54114700的博客 1206

Java数据结构与算法(三)单链表

Java数据结构与算法(三)单链表 前言 本篇文章是Java数据结构与算法系列的第三篇文章,经过前面两篇关于队列的学习之后,我们现在开始学习链表。 认识链表 链表是一种常用的数据结构,它是用于存储数据的。链表,顾名思义他就是一个表,而且数据是以链式存储的,通过各个节点连接起来,这样就成了一个链表。链表是一个有序的列表,一个链表中包含很多节点,每个节点都会有自己的数据域和next指针,next指针指向下一个节点。 链表的各个节点不一定是连续存储的,它是比较抽象的,通过next指针去连接。而链表分为单链表和双链

aaa13250765414的博客 161

【java】数据结构----单链表

链表(Linked List)是一种常见的数据结构,也是一种线性表,它相比于其他数据结构具有插入快,删除快的优点,同时链表可以灵活的分配存储空间。但链表并不能说是完美的数据结构,它的结构由于每个节点中会存放下一个节点中的位置,所以会有额外的内存开销,同时链表的结构也表明其查找的效率会比较低。 本篇博客主要讲述链表中最简单的一种———单链表。单链表仅允许单向遍历,同时有删除头结点,删除节点,查找,增...

linqxxy的博客 195

Java之单链表篇!!! (无头单向非循环链表实现打印、头插、尾插、任意插入、查找、删除某一关键字、删除所有所选关键字、清空单链表等基本操作)

单链表代码虽然不太难但是逻辑思维很强。 首先对单链表的结构进行介绍,单链表是由很多个节点一个接一个串接起来的,每个节点包含两部分,数据部分和地址部分,我们这里讲的是无头的单链表,所以没有头节点,每个节点存储的是本身的数据和下一个节点的地址。 如图,每个节点对应下面的地址。那第一个节点的地址设置为0x111,节点中存储的数据为1,存储的下一个节点的地址为0x22,直到最后一个节点因为后面没有节点了...

char_m的博客 802

数据结构-单链表

定义:单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。特点:链表中的数据是以结点来表示的,每个结点包含数据元素和指向下一个结点的指针。链表中的元素在内存中不必连续存储,其物理存储位置可以是随机的。链表的访问方式通常为顺序访问,即从头结点开始逐个访问。链表适用于写操作多、读操作少,且需要动态调整数据结构大小的场景。

没出过地球 499

Java数据结构与算法之单链表

一、前言 数组对于内存的要求比较高,需要一块连续的内存空间来存储,如果你申请的一个100M大小的数组,当内存中没有连续的,足够大的存储空间时,即便剩余内存可用空间大于100MB,申请仍然会是失败的。第二方面在当顺序表中内存容量不足时,则必须重新申请一个数组,将原来的数据复制到新的数组中,数据搬移消耗了大量的性能和时间(数据达到一定量级)。在顺序表中元素的插入和删除也可能存在数据的搬移,也会消耗一...

anyway8090的博客 291

算法与数据结构笔记11——单链表(Singly Linked List)

前言 了解数据结构的小伙伴,应该有听说过单链表。那么是单链表呢?单链表的使用是怎么样的呢?下面就分享一下我理解的单链表。 单链表概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。 单链表示例图 单链...

裕博的博客 608

Java数据结构-------单链表(图解增删改查详细实现,附反转链表实现)

目录 1.什么是链表? 2.单链表的基本功能和结构 3.单链表基本功能代码具体实现 1.清空链表,获取链表长度,判断链表是否为空 2.获取指定位置的元素 3.像链表中添加元素t 4.向指定位置i处插入元素t 5.删除指定位置i处的元素,并返回该元素 6.查找元素第一次出现的位置 7.反转链表 1.什么是链表? 一:链表是什么 1、链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的...

执梗的博客 1861
上一篇: MySQL存储过程实例——实现查询数据表,有则更新无则插入
下一篇: 单链表的基本操作二——排序 (java)
^^_candice
博客等级 码龄10年 3粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值