线性表:
谈到线性表(Linear List),首先应该从线性表的逻辑定义来看。从逻辑上来看,线性表就是由n(n>=0)个数据元素a1,a2,a3.....an组成的有限序列,序列有以下特点:
- 有且只有一个开始结点,没有直接前驱结点,有且只有一个直接后继结点
- 有且只有一个终结结点,没有直接后驱结点,有且只有一个直接前继结点
- 其余的内部结点,都仅有一个直接前驱结点和一个直接后继结点
- 对于同一线性表,各数据元素都有相同的数据类型,每个数据元素长度相同
从存储结构来看,一种是顺序存储结构(用数组来实现顺序存储)来实现另一种是链式存储结构(链式存储的线性表称为链表)
链表:
用指针实现前后结点的连接。
关于java的指针问题:T a=new T( );java的引用和对象的一一对应关系就是由指针实现的,引用a被jvm将内存分配在栈中,而将对象存储在堆中,a由指针从栈指向堆。
用java实现链表:
结点类:
public class Node {
int data;
Node next;
Node(){}
Node(int x){
data=x;
}
}
链表类的数据成员:(将这种数据结构所需的运算操作的常用数据声明为成员变量)
public class LinkList {
int length;//除去头节点后链表的长度
Node head;//头节点
Node tail;//尾节点}链表类的构造函数:(构造一个只有头结点的空链表)
public LinkList(){
length=0;
head=new Node();
head.next=null;
tail=head;//此时头节点尾节点是同一个
}
链表类的添加函数:
添加的位置分类:(1).头结点之后的插入位置( 2).插入位置在链表的尾部(3)插入位置在链表的中间,需要找到插入位置的前一位置
public void addnode(Node node){//在链表之尾添加结点
tail.next=node;
node.next=null;
tail=node;
length++;
}
public void addnode(Node node,int index){//0位置表示头节点,index表示数据要插入位置
if(index>length+1||index<=0){System.out.println("插入位置不存在");}//无此插入位置
else {
if(index==1)//插入到头节点之后
{ node.next=head.next;
head.next=node;
length++;
}
if(index>1){//插入到其他位置。
if(index==length+1) addnode(node);//插入位置在链表的末尾
else{
Node temp=head;//如果不是特殊位置,需要找到插入位置的前一位置
index=index-1;
for(int i=1;i<=index;i++){
temp=temp.next;
}//当循环结束,temp表示插入位置的前一位置
node.next=temp.next;
temp.next=node;
length++;
}
}
}
}
链表类的删除函数:
删除位置分类(1)头结点之后的位置(2)链表的中间的位置(3)链表的尾部
public void deletenode(int index){
if(index<=0||index>length)
System.out.println("无此删除位置");//无此删除位置
else{
if(index==1){//删除位置在头结点之后
head.next=head.next.next;
length--;
}
else{
Node temp=head;
for(int i=1;i<=index-1;i++){
temp=temp.next;
}//寻找到需要删除位置的前一位置
if(index==length){//删除位置在链表尾部,直接将前一结点的指针置空
temp.next=null;
tail=temp;
length--;
}
else{//中间的非特殊结点
temp.next=temp.next.next;
length--;}
}
}
}
链表类的查询函数:
public int find(int t){//如果找到返回所在位置,否则返回-1
int index=1;
if(head==tail) return -1;
else{
Node temp=head;
while(temp!=tail){//循环到链表尾部
temp=temp.next;
if(temp.data==t){return index;//如果找到,返回位置并退出
}
index++;
}
return -1;//未找到结果退出
}
}
链表类的遍历函数:
public void traversal(){//遍历链表,并打印
if(head==tail)System.out.println("这是空链表");
else {
Node temp=head;
while(temp!=tail){
temp=temp.next;
System.out.print(temp.data+" ");
}
System.out.println();
}
}
1644

被折叠的 条评论
为什么被折叠?



