Java链表实现删除重复结点以及合并链表(非递减)

Java链表已在上一篇文章写出,不再赘述


1.删除重复结点:

1)思路:从单链表的首结点开始依次将单链表中每一个结点与他的后面的所有节点相比较,若遇到相等的,则将此结点从链表中删除,当对每个结点都处理完后,算法结束

2)实现:

<span style="font-family:SimSun;font-size:18px;">package test;

import linkList.LinkList;
import linkList.Node;

public class DeleteRepetitive {
	public static void main(String[] args)throws Exception{
		System.out.println("请输入单链表中的10个节点值:");
		LinkList L=new LinkList(10,false);
		System.out.println("删除重复节点前单链表中的所有节点为:");
		L.display();
		removeRepeatElem(L);
		System.out.println("删除重复节点后单链表中的所有节点为:");
		L.display();
	}
	
	public static void removeRepeatElem(LinkList L)throws Exception{
		Node p=L.head.next;//初始化,p指向首结点
		Node q;
		while(p!=null){//从首结点往后查找,直到p为空
			int order=L.indexOf(p.data);//记录p在单链表中的位置
			q=p.next;
			while(q!=null){
				if((p.data).equals(q.data)){//与p的所有后继结点比较
					L.remove(order+1);//删除重复结点
				}
				else{
					++order;
				}
				q=q.next;
			}
			p=p.next;
		}
	}
}
</span>

2.合并链表(非递减):

1)思路:在插入值的过程中,引进3个指针pa,pb,pc,其中pa和pb分别指向链表LA和LB中当前待比较的结点,而PC指向新形成的单链表中当前的最后一个结点。pa和pb的初始值分别指向LA和LB的第一个结点,pc的初始值指向LA的头结点。当pa.data<=pb.data,则将pa所指的结点连接到pc所指的结点之后,否则将pb所指向的结点连接到pc所指向的节点后,当一个链表为空表时,只要将另一个单链表的剩余段里阿尼额在pc所指向的结点之后。

2)实现:

<span style="font-family:SimSun;font-size:18px;">package test;

import java.util.Scanner;

import linkList.LinkList;
import linkList.Node;

public class Merge {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int m=0,n=0;
		System.out.println("请输入LA中结点的个数:");
		m=sc.nextInt();
		System.out.println("请按非递减方式输入"+m+"个数字");
		LinkList LA=new LinkList(m,false);
		System.out.println("请输入LB中结点的个数:");
		n=sc.nextInt();
		System.out.println("请按非递减方式输入"+n+"个数字");
		LinkList LB=new LinkList(n,false);
		System.out.println("合并之后,新的链表LA中的各个元素:");
		mergeList(LA, LB).display();
	}
	public static LinkList mergeList(LinkList LA,LinkList LB){
		Node pa=LA.head.next;//初始化,pa位LA的首结点
		Node pb=LB.head.next;
		Node pc=LA.head;
		int da,db;
		while (pa!=null&&pb!=null) {
			da=Integer.valueOf(pa.data.toString());//字符串转换为整数
			db=Integer.valueOf(pb.data.toString());
			if(da<=db){//将LA中的结点加入到新的LA中
				pc.next=pa;
				pc=pa;
				pa=pa.next;
			}
			else{
				pc.next=pb;
				pc=pb;
				pb=pb.next;
			}
		}
		pc.next=(pa!=null?pa:pb);//插入剩余结点
		return LA;
	}
}
</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值