数据结构链表实现代码(java语言版)
- 格式:docx
- 大小:28.25 KB
- 文档页数:14
package link;
//链表的基本类(每一个节点)
publicclass Link {
//有两个属性
//数据域
privateintdata=-1; //-1表达是没有数据
//指针域
private Link next=null; //空指针
publicintgetData() {
returndata;
}
publicvoidsetData(int data) {
this.data = data;
}
public Link getNext() {
returnnext;
}
publicvoidsetNext(Link next) {
this.next = next;
}
}
package link;
importjava.util.Scanner;
//算法类对于链表的所有的操作
publicclass Algorithm {
//链表的初始化:创建一个空的头节点
publicvoidlink_ininal(Link H){
H=newLink();
}
//创建新节点封装节点
public Link link_new(int x){
Link p=new Link();
p.setData(x);
return p;
}
//表头插入法创建链表
publicvoidlink_topfound(Link H){
Scanner sc=newScanner(System.in);
int x;
Link p;
System.out.println("请输入数据,输入0结束:");
x=sc.nextInt();
while(x != 0){
//对x封装
p=link_new(x);
//1。先让p连接H的下一个节点
p.setNext(H.getNext());
//2。H连接p
H.setNext(p);
System.out.println("请输入数据,输入0结束:");
x=sc.nextInt();
} }
//输出链表
publicvoidlink_output(Link H){
Link p;
//p的初次站位
p=H.getNext();
while(p != null){
//p节点的data值输出来
System.out.print(p.getData()+" ");
//p向后走
p=p.getNext();
}
System.out.println();
}
public Link link_findend(Link H){
Link q;
q=H;
while(q.getNext() != null){
q=q.getNext();
}
return q;
}
//表尾法创建链表
publicvoidlink_endfound(Link H){
Scanner sc=newScanner(System.in);
//需要一个总是站到表尾的哨兵q
int x;
//哨兵q应该站在当前链表的最后一个节点上
Link q=link_findend(H); Link p;
System.out.println("请输入数据,输入0结束:");
x=sc.nextInt();
while(x != 0){
//封装
p=link_new(x);
//q链接p
q.setNext(p);
//q先后移动
q=q.getNext();
System.out.println("请输入数据,输入0结束:");
x=sc.nextInt();
}
}
//链表的定位操作,返回找到的节点
public Link link_find(Link H,int x){
Link p;
//p初始站位
p=H.getNext();
while(p != null){
if(p.getData() == x){
break;
}
//p后走
p=p.getNext();
}
//找到 p节点没有找到就是null
return p; }
//链表的删除
publicbooleanlink_del(Link H,int x){
Link p,q;
boolean f=false; //删除失败
//站位
p=H.getNext();
q=H;
while(p != null){
if(p.getData() == x){
break;
}
//2人都向后走
p=p.getNext();
q=q.getNext();
}
//删除:如果删除成功,f=true
if(p != null){ //找到了,实现删除
q.setNext(p.getNext());
f=true;
}
return f;
}
//定位插入
publicvoidlink_in(Link H,Linkp,int x){
//给x封装
Link s=link_new(x);
//把s插入到p的后边
//1 s连接p的下一个节点 s.setNext(p.getNext());
//2 p连接s
p.setNext(s);
}
//链表的变异的冒泡排序
publicvoidlink_order(Link H){
Link p,q;
int t;
//外层表示趟数
for(q=H.getNext(); q.getNext()!= null;
q=q.getNext()){
for(p=H.getNext();p.getNext() !=
null;p=p.getNext()){
//开始比较p的数据和p的下一个节点的数据
if(p.getData() >p.getNext().getData()){
t=p.getData();
p.setData(p.getNext().getData());
p.getNext().setData(t);
}
}
}
}
//有序插入(重写)
publicvoidlink_in(Link H,int x){
Link q,p,s;
p=H.getNext();
q=H;
while( p!=null&&p.getData() < x ){ p=p.getNext();
q=q.getNext();
}
//x节点插入到q和p之间
s=link_new(x);
//1 s连上p
s.setNext(p);
//2 q连上s
q.setNext(s);
}
//链表的逆序
public Link link_revert(Link H){
//生成一个新的链表的头结点
Link H2=newLink();
Link s;
//循环的条件就是H链表后面还有节点吗
while(H.getNext() != null){
//循环完成以下操作
//1 从H上截取一个节点
s=H.getNext();
H.setNext(s.getNext());
//2 以表头插入法的方法把截取的节点插入到H2链表
//s指向H2的下一个节点
s.setNext(H2.getNext());
//H2指向s
H2.setNext(s);
}
return H2;
}
}
package link;
publicclass Menu {
void display()
{
System.out.printf("|--------------------------------------------------------------------------|\n");
System.out.printf("|------------------------------链表操作-------------------------------------|\n");
System.out.printf("|--------------------------------------------------------------------------|\n");
System.out.printf(" |----------- 1.创建链表
-----------|\n");
System.out.printf(" |----------- 2.输出链表内容
-----------|\n");
System.out.printf(" |----------- 3.链表的定位
------------|\n");
System.out.printf(" |----------- 4.链表中删除指定值的结点 ------------|\n");
System.out.printf(" |----------- 5.链表的定位插入
------------|\n");