链表是一种物理上非连续、非顺序的存储结构,数据元素之间的顺序是通过每个元素的指针关联的。
链表有一系列节点组成,每个节点一般至少会包含两部分的信息:(1)元素数据 (2)指向下一个元素的指针
链表分类: (1)单向链表和双向链表 (2)静态链表(数组实现) 、动态链表(指针)
链表的操作: 创建、插入、删除、输出
链表的特点:
(1)物理空间不连续,空间开销更大
(2)在运行时可以动态添加
(3)查找元素需要顺序查找
动态链表的实现代码如下:
package com.threeTop.www;
//节点部分的定义
public class Node {
private int data;
private Node next;
/**
* 获得数据
* @return
*/
public int getData()
{
return data;
}
/**
* 设置数据
* @param data
*/
public void setData(int data)
{
this.data=data;
}
/***
* 获得下一个节点
*/
public Node getNext()
{
return next;
}
/**
* 移动到下一个节点
*/
public void setNext(Node next)
{
this.next=next;
}
}
package com.threeTop.www;
/**
* 链表的实现
* @author zc
*
*/
public class Link {
private int size=0;
private Node first;
private Node last;
/**
* 链表的初始化
*/
public Link()
{
}
/**
* 链表的后部插入
*/
public void addLast(int data)
{
if(size==0)
{
//为空初始化前后元素
fillStart(data);
}else
{
Node node=new Node();
node.setData(data);
//last=this.get(size-1); //找到尾结点
last.setNext(node);
last=node; //把最后插入的元素设置为链表尾的元素
}
size++;
}
/***
* 链表头部插入
* @param data
*/
public void addFirst(int data)
{
if(size==0)
{
//为空初始化前后元素
fillStart(data);
}else
{
Node node=new Node();
node.setData(data);
node.setNext(first); //把元素的下一个位置的指针指向头元素
first=node; //把刚插入的元素设置为链表头元素
}
size++;
}
/***
* 在链表的指定位置后面插入
* @param data 需要插入的数据
* @param index 下标从0开始
*/
public void add(int data ,int index)
{
if(size>index)
{
if(size==0)
{
//为空初始化前后元素
fillStart(data);
size++;
}
else if(index==0)
{
addFirst(data);
}
else if(size==index+1)
{
addLast(data);
}
else
{
//在中间的位置插入元素
Node temp=get(index);
Node node=new Node();
node.setData(data);
node.setNext(temp.getNext());
temp.setNext(node);
size++;
}
}
else
{
throw new IndexOutOfBoundsException("链表没有那么长!");
}
}
/***
* 获取指定下标元素
* @param index
* @return
*/
private Node get(int index) {
// TODO Auto-generated method stub
Node temp=first;
for(int i=0;i<index;i++)
{
temp=temp.getNext();
}
return temp;
}
/***
* 初始化链表
* @param data
*/
private void fillStart(int data) {
// TODO Auto-generated method stub
first=new Node();
first.setData(data);
last=first; //刚开始位置写反了
}
/***
* 删除链表的表头元素
*/
public void removeFirst()
{
if(size==0)
{
throw new IndexOutOfBoundsException("链表没有元素!");
}
else if(size==1)
{
//只剩下一个元素时,清楚first和last
clear();
}
else
{
Node temp=first;
first=temp.getNext();
temp=null; //头元素删除
size--;
}
}
/***
* 在元素只有一个时清除first和last元素
*/
private void clear()
{
// TODO Auto-generated method stub
first=null;
last=null;
size=0;
}
/***
* 删除链表的尾部元素
*/
public void removeLast()
{
if(size==0)
{
throw new IndexOutOfBoundsException("链表没有元素!");
}
else if(size==1)
{
clear();
}
else
{
Node temp=get(size-2);//获取最后一个元素之前的一个元素
temp.setNext(null);
size--;
}
}
/***
* 删除链表的中间元素与
*/
public void removeMiddle(int index)
{
if(size==0)
{
throw new IndexOutOfBoundsException("链表没有元素!");
}
else if(size==1)
{
clear();
}
else
{
if(index==0)
{
removeFirst();
}
else if(size==index-1)
{
removeLast();
}
else
{
Node temp=get(index-1); //获得删除元素的前一个元素
Node next=temp.getNext();
temp.setNext(next.getNext());
next=null;
size--;
}
}
}
/***
* 打印所有元素的数据
*/
public void printAll()
{
Node temp=first;
System.out.print(temp.getData()+" ");
for(int i =0;i<size-1;i++)
{
temp=temp.getNext();
System.out.print(temp.getData()+" "); //挨个输出链表中的元素
}
}
/**
* 获得链表的大小
*/
public int size()
{
return size;
}
/**
* 反转链表
*/
public void reverse()
{
Node temp=first;
last=temp;
Node next=first.getNext();
for(int i=0;i<size-1;i++)
{
Node nextnext=next.getNext(); //下下个
next.setNext(temp);
temp=next;
next=nextnext;
}
last.setNext(null);
first=temp;
}
/***
* main函数
* @param args
*/
public static void main(String [] args)
{
Link link=new Link();
link.addFirst(5);
link.addFirst(1);
link.addFirst(2);
link.addFirst(3);
link.addLast(3);
link.addLast(4);
link.add(1, 1); //在下标为1的元素之后插入元素
link.printAll(); //打印所有的元素
link.removeFirst();
System.out.println();
link.printAll(); //打印所有的元素
link.removeLast();
System.out.println();
link.printAll(); //打印所有的元素
link.removeMiddle(3);
System.out.println();
link.printAll(); //打印所有的元素
System.out.println();
System.out.println("链表的大小:"+link.size());
link.reverse(); //反转链表
System.out.println();
link.printAll(); //打印所有的元素
}
}
输出结果: