数据结构学习笔记一:单向链表
线性结构
线性表是一种线性结构,它是具有相同类型的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]");}
}
}