链表的增删改查Java代码实现

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。
链表与数组之间的差别是:
(1)数组的元素个数是固定的,而组成链表的结点个数可按需要增减;
(2)数组元素的存诸单元在数组定义时分配,链表结点的存储单元在程序执行时动态向系统申请:
(3)数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系由结点所包含的指针来体现。
(4)对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多内存空间。
(5)对于元素的插人、删除操作非常频繁的列表处理场合,用数组表示列表也是不适宜的。若用链表实现,会使程序结构清晰,处理的方法也较为简便。
  例如:在一个列表中间要插人一个新元素,如用数组表示列表,为完成插人工作,插人处之后的全部元素必须向后移动一个位置空出的位置用于存储新元素。
对于在一个列表中删除一个元素情况,为保持数组中元素相对位置连续递增,删除处之后的元素都得向前移一个位置。如用链表实现列表.链表结点的插人或删除操作不再需要移动结点,只需改变相关的结点中的后继结点指针的值即可,与结点的实际存储位置无关。

下面是链表的各种操作代码实现

package 链表学习;
class singleLinkedListDemo{
	//定义一个头节点
	private HeroNode head=new HeroNode(0,"");
	//获取头节点的方法,因为上面私有成员不能直接使用
	public HeroNode getHead() {
		return head;
	}
	//添加节点
	public void addNodelist(HeroNode heroNode) {
		//因为head节点是不能动的,所有定义一个辅助节点
		HeroNode temp=head;
		while(true) {
			if(temp.next==null) {
				break;
			}
			temp=temp.next;
		}
		temp.next=heroNode;
	}
	
	//修改节点
	public void upDataNode(int id,String name) {
		HeroNode temp=head.next;
		boolean flag=false;
		if(temp==null) {
			System.out.println("链表为空");
			return;
		}
		while(true) {
			if(temp.id==id) {
				flag=true;
				break;
			}
			if(temp.next==null) {
				break;
			}
			temp=temp.next;
		}
		if(flag) {
			temp.name=name;
		}else {
			System.out.println("没有找到id为"+id+"的节点");
		}
		
	}
	
	//删除节点
	public void delNode(int id) {
		HeroNode temp=head;
		boolean flag=false;
		while(true) {
			//已经遍历到最后需要退出循环
			if(temp.next==null) {
				break;
			}
			//找到需要删除的节点的前一个节点
			if(temp.next.id==id) {
				flag=true;
				break;
			}
			temp=temp.next;
		}
		if(flag) {
			temp.next=temp.next.next;
		}else {
			System.out.println("没有找到id为"+id+"的节点");
		}
	}
	
	
	//显示链表
	public void showLinklist(HeroNode head) {
		if(head.next==null) {
			System.out.println("链表为空");
			return;
		}
		HeroNode temp=head.next;
		while(true) {
			if(temp==null) {
				break;
			}
			System.out.println(temp);
			temp=temp.next;
		}
	}
}

//创建链表节点的类
class HeroNode{
	public int id;
	public String name;
	public HeroNode next;
	public HeroNode(int id,String name) {
		super();
		this.id=id;
		this.name=name;
	}
	
	@Override
	public String toString() {
		return "HeroNode [id=" + id + ", name=" + name + "]";
	}
}
public class Linedlist {
	public static void main(String[] args) {
		singleLinkedListDemo singleLinkedListDemo=new singleLinkedListDemo();
		HeroNode heroNode1=new HeroNode(1,"张三");
		HeroNode heroNode2=new HeroNode(2,"李四");
		HeroNode heroNode3=new HeroNode(3,"王五");
		HeroNode heroNode4=new HeroNode(4,"小明");
		HeroNode heroNode5=new HeroNode(5,"小红");
		
		System.out.println("-------------添加节点-------------");
		//添加节点
		singleLinkedListDemo.addNodelist(heroNode1);
		singleLinkedListDemo.addNodelist(heroNode2);
		singleLinkedListDemo.addNodelist(heroNode3);
		singleLinkedListDemo.addNodelist(heroNode4);
		singleLinkedListDemo.addNodelist(heroNode5);
		//显示节点
		singleLinkedListDemo.showLinklist(singleLinkedListDemo.getHead());
		
		System.out.println("-------------修改节点-------------");
		//修改节点
		singleLinkedListDemo.upDataNode(4,"小兰");
		//显示节点
singleLinkedListDemo.showLinklist(singleLinkedListDemo.getHead());
		
		//删除节点
		System.out.println("-------------删除节点-------------");
		singleLinkedListDemo.delNode(2);
		//显示节点	
		singleLinkedListDemo.showLinklist(singleLinkedListDemo.getHead());
	}
}
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构算法支撑。2.网上数据结构算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构算法, 除常用数据结构算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构算法。教程内容:本教程是使用Java来讲解数据结构算法,考虑到数据结构算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、形队列、单向链表、双向链表链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构算法实现机制,开阔编程思路,提高优化程序的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>