数组查询速度虽然快,但插入删除不方便,链表不是线性存储,便于插入删除。可以将链表比作一辆火车,链表的节点就是一节节车厢,节点中的数据就是车厢中的东西,节点间的联系就是车厢之间的联系。
如何实现一个链表呢?“万丈高楼平地起”,做“火车”先得准备“车厢”-------节点类
节点中有两个属性:1.数据,2.对下一个节点的指向
package list;
public class LinkNode {
Object data;
public LinkNode next;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public LinkNode getNext() {
return next;
}
public void setNext(LinkNode next) {
this.next = next;
}
}
“车厢”准备好了,可以组装火车了。首先考虑一个链表有哪些属性,毫不疑问,有以下几个:
1.根节点(root),2.链表长度(length);
链表的方法:增,删,改,查;
代码如下:
package list;
//T是泛型
public class LinkList<T> {
private LinkNode root=null,tail=null;
int length=0;
//得到长度
public int size(){
return length;
}
//添加
public void add(T data){
LinkNode node=new LinkNode();
node.setData(data);
node.setNext(null);
length++;
if(root==null){
root=node;
tail=root;
}else{
tail.next=node;
tail=node;
}
}
//查询
public LinkNode getNode(int index){
LinkNode node=new LinkNode();
node=root;
for(int i=0;i<index-1;i++){
node=node.next;
}
return node;
}
//按数据删除
public void delData(T data){
int count=0;
for(int i=0;i<this.length;i++){
LinkNode node=this.getNode(i);
if(node.data==data){
if(node==root){
root=root.next;
}else
{
LinkNode newnode=this.getNode(i-1);
newnode.setNext(node.next);
}
length--;
count++;
}
}
if(count==0){
System.out.println("not found !");
}
}
//按索引删除
public void delIndex(int index){
if(index==1){
root=root.next;
length--;
}
else if(index>1&&index<=length){
LinkNode node1=this.getNode(index);
LinkNode node2=this.getNode(index-1);
node2.setNext(node1.next);
length--;
}
else{
System.out.println("error");
}
}
//插入
public void insert(T data,int index){
if(index>length||index<1){
System.out.println("error");
}
else{
LinkNode node=new LinkNode();
node.setData(data);
length++;
if(index==1){
node.setNext(root);
root=node;
}
else
{
LinkNode node1=this.getNode(index);
LinkNode node2=this.getNode(index-1);
node.setNext(node1);
node2.setNext(node);
}
}
}
//遍历
public void travel(LinkList list){
for(int i=0;i<list.length;i++){
LinkNode node=list.getNode(i+1);
System.out.println(node.data);
}
}
//更新
public void update(int index ,T data){
if(index>length||index<1){
System.out.println("error");
}
else
{
LinkNode node=this.getNode(index);
node.setData(data);
}
}
public static void main(String []args){
LinkList list=new LinkList();
for(int i=0;i<10;i++){
list.add(i+1);
}
list.travel(list);
list.delData(6);
list.travel(list);
list.delIndex(10);
list.travel(list);
list.update(4, 100);
list.travel(list);
}
}