您的位置:首页 > 编程语言 > Java开发

java编程实现将两个有序单链表LA,LB合并成新的LA

2017-10-13 09:38 253 查看
问题分析:本题要求利用原有的单链表LA,LB中的结点来产生一个新的链表LA,新的单链表首先以LA的头结点为头结点构成一个空表,然后用尾插法将LA LB中的各结点按从小到大顺序插入到新形成的链表中。
       插入过程中引入3个指针pa,pb,pc,其中pa,pb分别指向LA,LB中当前待比较的结点,pc指向新链表的当前最后一个结点。pa,pb初始值指向LA,LB的首结点,pc初始值指向LA头结点。
       当pa.getdata()<pb.getdata()时,pc.setnext(pa)否则pc.setnext(pb) 当其中一个单链表为空表时,只要将另一个单链表的剩余段链接在pc所指的结点之后。


结点类的描述:
public class Node {
private Object data; //存放结点值
private Node next; //后继节点的引用
public Node(){ //无参时构造函数
this(null,null);
}
public Node(Object data){ //带一个参数时都构造函数
this(data,null);
}
public Node(Object data,Node next){ //带两个参数时的构造函数
this.data=data;
this.next=next;
}
}
合并链表:import java.util.Scanner;

public class Linklist {
public Node head; //单链表的头指针
public Linklist(){
head=new Node();
}
public void insert(int i,Object x)throws Exception{ //在带头结点的单链表中的第i个结点之前插入一个值为x的新结点
int j=0;
Node p=head;
while(j<i&&p!=null){
p=p.next;
j++;
}
if(p==null||j>i){
throw new Exception("插入位置不合理");
}
Node s=new Node(x);
s.next=p.next;
p.next=s;
}
public void display(){ //输出单链表中所有结点
Node p=head.next;
while(p!=null){
System.out.print(p.data+" ");
p=p.next;
}
System.out.println();
}
public int length(){
Node p=head.next;
int length=0;
while(p!=null){
p=p.next;
length++;
}
return length;
}
public void create(int m)throws Exception{
Scanner sc=new Scanner(System.in);
for(int i=0;i<m;i++)
insert(length(),sc.next());
}

public static Linklist mergelist(Linklist LA,Linklist LB){
Node pa=LA.head.next;
Node pb=LB.head.next;
Node pc=LA.head;
while(pa!=null&&pb!=null){
int da=Integer.valueOf(pa.data.toString()); //把字符串转换成浮点数
int db=Integer.valueOf(pb.data.toString());
if(da<=db){ //将LA的结点加入到新的LA中
pc.next=pa;
pc=pa;
pa=pa.next;
}
else{ //将LB的结点加入到新的LB中
pc.next=pb;
pc=pb;
pb=pb.next;
}
}
pc.next=(pa!=null?pa:pb); //插入剩余结点
return LA;
}
public static void main(String[] args)throws Exception{
Linklist LA=new Linklist();
Linklist LB=new Linklist();
System.out.println("请按非递减方式输入4个数字");
LA.create(4); //尾插法创建单链表LA
System.out.println("请按非递减方式输入5个数字");
LB.create(5);
System.out.println("合并后的链表是");
mergelist(LA,LB).display();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐