实现链表的思路:
1)链表类,结点类(链表类的内部类),在main()方法创建一条链表类对象,通过方法逐步创建结点类,通过引用链接起来成为链表。
2)结点类包含数据和对下个结点的引用,以及可以对数据赋值的构造函数。
3)链表类的构造方法,只构造出不含数据的头结点。(外部类可以直接对内部类的私有成员进行访问,这样就可以直接修改引用)
链表类:
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;
}
}
show方法
public void show(){
Entry cur = head.next;
while (cur != null){
System.out.print(cur.data+" ");
cur = cur.next;
}
System.out.println();
}
头插法
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){//找到尾巴
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){
//1、判断pos的合法性
if(pos < 0 || pos >getLength()){
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;
}
求单链表倒数第K节点(求倒数第k节点即为求第length-k+1节点,循环找到此节点即可)
public int BackWardsToK(int k){
if(k>getLength()-1){
System.out.println("不存在此节点");
}
int a=getLength()-k+1;//倒数第k个节点即为第a个节点
int count = 1;//计数,下标从1开始
Entry cur=head.next;
while(cur!=null){
if(count==a){
break;
}
count++;
cur=cur.next;
}
return cur.data;
}