数据结构学习笔记一:单向链表

数据结构学习笔记一:单向链表

线性结构

线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列。本章先介绍线性表的几个基本组成部分:数组、单向链表、双向链表;随后给出双向链表的C、C++和Java三种语言的实现。内容包括:
数组
单向链表
双向链表

数组

数组有上界和下界,数组的元素在上下界内是连续的。

存储10,20,30,40,50的数组的示意图如下:在这里插入图片描述
数组的特点是:数据是连续的;随机访问速度快。
数组中稍微复杂一点的是多维数组和动态数组。对于C语言而言,多维数组本质上也是通过一维数组实现的。至于动态数组,是指数组的容量能动态增长的数组;对于C语言而言,若要提供动态数组,需要手动实现;而对于C++而言,STL提供了Vector;对于Java而言,Collection集合中提供了ArrayList和Vector。

单向链表

单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针。

单链表的示意图如下:
在这里插入图片描述
表头为空,表头的后继节点是"节点10"(数据为10的节点),“节点10"的后继节点是"节点20”(数据为10的节点),…

单链表删除节点

在这里插入图片描述
删除"节点30"
删除之前:“节点20” 的后继节点为"节点30",而"节点30" 的后继节点为"节点40"。
删除之后:“节点20” 的后继节点为"节点40"。

单链表添加节点

在这里插入图片描述
在"节点10"与"节点20"之间添加"节点15"
添加之前:“节点10” 的后继节点为"节点20"。
添加之后:“节点10” 的后继节点为"节点15",而"节点15" 的后继节点为"节点20"。

单链表的特点是:节点的链接方向是单向的;相对于数组来说,单链表的的随机访问速度较慢,但是单链表删除/添加数据的效率很高。

单向链表实现:

package com.ccy.datastructure;

public class SingleLinkedList{
	private int size; //list's size
	private Node head; //head

	public SingleLinkedList(){
		size = 0;
		head = null;}
	
	//node
	private class Node{
		private Object data;  //data of every node
		private Node next; //point to next node

		public Node(Object data){
			this.data = data;}

	//add node before Head and return head 
	public Object addHead(Object obj){
		Node newHead = new Node(obj);
		if(size == 0){
			head = newHead;}
		else{
			newHead.next = head;
			head = newHead;}
		size++;
		return obj;}
	
	//delete node Head and return head's data
	public Object deleteHead(){
		Object obj = head.data;
		head = head.next;
		size--;
		return obj;}

	//find specific node and return it, if not return null
	public Node find(Object obj){
		Node current = head;
		int tempSize = size;
		while(tempSize > 0){
			if(obj.equals(current.data)){
				return current;}
			else{
				current = current.next;}
		return null;}

		//delete specific node and return true
		public boolean delete(Object value){
			if(size == 0){
				return false;}

			Node current = head;
			Node previous = head;
			while(current.data != value){
				if(current.next == null){
					return false;}
				else{
					previous = current;
					current = current.next;}
			}

			if(current == head){
				head = current.next;
				size--;}
			else{
				previous.next = current.next;
				size--;}
			return true;}

			//return true if list is empty
			public boolean isEmpty(){
				return (size == 0);}

			//print whole list
			public void display(){
				if(size > 0){
					Node node = head;
					int tempSize = size;
					if(tempSize == 1){
						System.out.println(node.data);
						return;}
					while(tempSize > 0){
						if(node.equals(head)){
							System.out.println(node,data + "->");}
						else if(node.next == null){
							System.out.println(node.data + "]");}
						else{
							System.out.println(node.data + "->");}
						node = node.next;
						tempSize--;}
					System.out.println();}
				else{
					System.out.println("[empty]");}
				}
			}
					
								
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值