Chapter202单链表
内容来自: 数据结构教程: Java语言描述/李春葆,李筱驰主编.
1、线性表的链式存储结构——单链表
- 单链表结点泛型类
public class LinkNode<E> {
//单链表结点泛型类
E data;
LinkNode<E>next;
public LinkNode(){
//构造方法
next = null;
}
public LinkNode(E d){
//重载构造方法
data = d;
next = null;
}
}
- 单链表泛型类
public class LinkListClass<E> {
//单链表泛型类
LinkNode<E> head; //存放头结点
public LinkListClass(){
//构造方法
head = new LinkNode<E>(); //创建头结点
head.next = null; //头结点的next成员置为null
}
//基本运算算法
}
插入结点操作:
s.next = p.next; p.next = s;
删除结点操作:
p.next = p.next.next;
- 用头插法整体建立单链表
public void createListF(E[] a) //头插法:由数组a整体建立单链表
{
LinkNode<E> s;
for(int i = 0; i < a.length; i++) //循环建立数据结点s
{
s = new LinkNode<E>(a[i]); //新建存放a[i]元素的结点s
s.next = head.next; //将s结点插入开始结点之前,头结点之后
head.next = s;
}
}
- 用尾插法整体建立单链表
public void createListR(E[] a) //尾插法:由数组a整体建立单链表
{
LinkNode<E> s,t;
t = head; //t始终指向尾结点,开始时指向首结点
for(int i = 0; i < a.length; i++) //循环建立数据结点s
{
s = new LinkNode<E>(a[i]); //新建存放a[i]元素的结点s
t.next = s; //将s结点插入t结点之后
t = s;
}
t.next = null; //将尾结点的next成员置为null
}
2、线性表的基本运算在单链表中的实现
- (1)查找返回序号为i的结点
public LinkNode<E> geti(int i) //返回序号为i的结点
{
LinkNode<E> p = head;
int j = -1;
while(j < i){
j++;
p = p.next;
}
return p;
}
- (2)将元素e添加到线性表的末尾
public void add(E e) //在线性表的末尾添加一个元素e
{
LinkNode<E> s = new LinkNode<E>(e); //新建结点s
LinkNode<E> p = head;
while(p.next != null) //查找尾结点p
p = p.next;
p.next = s; //在尾结点之后插入结点s
}
- (3)求线性表的长度
public int size() //求线性表的长度
{
LinkNode<E> p = head;
int cnt = 0;
while(p.next != null) //找到尾结点为止
{
cnt+=;
p = p.next;
}
return cnt;
}
- (4)设置线性表的长度
public void setSize(int nlen) //设置线性表的长度
{
int len = size();
if(nlen < 0 || nlen > len)
throw new IllegalArgumentException("设置长度:n不在有效范围内");
if(nlen == len) return;
LinkNode<E> p = geti(nlen - 1); //找到序号为nlen - 1的结点p
p.next = null; //将结点p置为尾结点
}
- (5)求线性表中序号为i的元素
public E getElem(int i) //返回线性表中序号为i的元素
{
int len = size();
if(i < 0 || i > len - 1)
throw new IllegalArgumentException("查找:位置i不在有效范围内");
LinkNode<E> p = geti(i); //找到序号为i的结点p
return (E)p.data;
}
- (6)设置线性表中序号为i的元素
public void setElem(int i, E e) //设置序号为i的元素为e
{
if(i < 0 || i > size() - 1)
throw new IllegalArgumentException("设置:位置i不在有效范围内");
LinkNode<E> p = geti(i); //找到序号为i的结点p
p.data = e;
}
- (7)求线性表中第一个值为e的元素的逻辑序号
public int getNo(E e) //查找第一个为e的元素的序号
{
int j = 0;
LinkNode<E> p = head.next;