链表是一种数据结构,和数组同级。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。
单链表结构:
单链表就相当于从头结点开始,每一个节点只要记录下一节点,就把所有数据串了起来,形成了一个单向链表。 各个节点的储存可以是分散的。
头插法:
尾插法:
class TestLink{
private Entry head;//指向头结点的引用
public TestLink(){
head = new Entry();
}
class Entry{//Entry Node
int data;
Entry next;
public Entry(){
data = -1;
next = null;
}
public Entry(int val){
data = val;
next = null;
}
}
public void insertHead(int val){//头插法
//有这么一个结点
Entry cur = new Entry(val);//先创建要插入的结点
cur.next = head.next;//使要插入的结点指向原来的第一个结点
head.next = cur;//然后头结点指向要插入的结点
}
public void insertTail(int val){
//找到尾巴
Entry cur = head;
while(cur.next != null){//当结点的地址域不为空时,让结点一直向后移动,知道找到地址域为null的结点,此时即是要找的链表的最后一个结点
cur = cur.next;
}
Entry entry = new Entry(val);//创建要插入的结点
cur.next = entry;//让最后一个阶段,指向要查入的结点
}
//得到单链表的长度:
public int getLength(){
int len = 0;
Entry cur = head.next;
while(cur != null){
len++;
cur = cur.next;
}
return len;
}
//将数据插入到指定位置
public boolean insertPos(int val,int pos){//pos是插入的位置序号
//1、判断pos的合法性
if(pos < 0 || pos >= getLength()+1){
return false;
}
Entry cur = head;
for(int i = 0;i <= pos-1;i++){
cur = cur.next;
}
//cur pos的前一个
Entry entry = new Entry(val);
entry.next = cur.next;
cur.next = entry;
return true;
}//show()
public void show(){//单链表的遍历
Entry cur = head.next;//获得了头结点
while(cur != null){//如果结点的地址域不为null,输出这个结点。然后头结点一直向后移动,知道找到地址域为null的结点
System.out.println("data:"+cur.data);
cur = cur.next;
}
}
}
单链表的逆置
public void nizhi(){
Entry cur = head.next;
Entry a = null;
Entry b = null ;
while(cur!=null){
a = cur.next;
cur.next = b;
b = cur;
cur = a;
}
head.next = b;
}
求单链表倒数第k个结点
public void select(int k){
int i;
Entry cur=head;
if(k>getLength()||k<0){//先判断k的值是否合法
System.out.println("超出链表范围");
}
for( i=0;i<=getLength()-k;i++){//进行循环,直到结点移动到我们要求的结点
cur=cur.next;
}
System.out.println(cur.data);//输出结点的值
}
}