Java链表操作
此链表由三个文件组成MyList,Node,Main
Node节点类
public class Node
{
int info; //数据域
Node next; //节点
Node(int info,Node next) //有参构造1
{
this.info=info;
this.next=next;
}
Node(int info) //有参构造2
{
this(info,null);
}
}
Main方法
public class Main {
public static void main(String[] args )
{
MyList m=new MyList();
m.addLast(10);// 尾插 10
m.addLast(30);//尾插 30
m.addFirst(60);// 头插60
m.addFirst(40);// 头插40
m.addFirst(50); // 头插50
m.removeAfter(50); //移除50
m.traversal();// 遍历展示
}
}
MyList链表类
public class MyList
{
Node head,tail;//头尾节点
public MyList()//无参构造
{
head=tail=null;//初始化
}
//判空方法
public boolean isEmpty()
{
return head==null;
}
//尾插
public void addLast(int x)
{
Node p=new Node(x);
if(isEmpty())
{
head=tail=p;
}
else
{
tail.next=p;
tail=p;
}
}
//头插
public void addFirst(int x)
{
Node p=new Node(x);
if(isEmpty())
{
head=tail=p;
}
else
{
p.next=head;
head=p;
}
}
//遍历链表数据域
public void traversal()
{
Node p=head;
while(p!=null)
{
System.out.println(p.info+" ");
p=p.next;
}
System.out.println("");
}
//链表长度
public int size()
{
Node p=head;
int c=0;
while(p!=null)
{
c++;
p=p.next;
}
return c;
}
//根据索引查找链表数据
public Node get(int k)
{
Node p=head;
int c=0;
while(p!=null&&c<k)
{
c++;
p=p.next;
}
return p;
}
//链表排序
public void sort()
{
int n=size();
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
Node pi=get(i),pj=get(j);
if(pi.info>pj.info)
{
int t=pi.info;
pi.info=pj.info;
pj.info=t;
}
}
}
}
//查找链表数据
public Node search(int x)
{
Node p=head;
while(p!=null&&p.info!=x)
{
p=p.next;
}
return p;
}
//删除链表数据和节点
void dele(Node q)
{
Node f,p;
f=null;
p=head;
while(p!=null)
{
if(p==q) break;
f=p;
p=p.next;
}
if(p==null)
{
return;
}if(f==null)
{
head=head.next;
if(head==null)
{
tail=null;
}
return;
}
f.next=p.next;
if(f.next==null)
{tail=f;
}
}
//移除链表
public void remove(Node p)
{
if(p==null)
{
return;
}
Node f=head,q=null;
while(f!=null&&f!=p)
{
q=f;
f=f.next;
}
if(q==null)
{
head=head.next;
if(head==null)
{
tail=null;
}
}
else
{
q.next=p.next;
if(p==tail)
{
tail=q;
}
}
p.next=null;
}
//逆置链表
public void reverse()
{
int n=size();
for(int i=0,j=n-1;i<j;i++,j--)
{
Node pi=get(i),pj=get(j);
int t=pi.info;
pi.info=pj.info;
pj.info=t;
}
}
//移除指定索引链表数据和节点
public void removeAfter(int x)
{
int c=0;Node p=head;
while(p!=null)
{
if(p.info<x) c++; if(c>=2) break;
p=p.next;
}
remove (p);
}
}