problem-whether two headless linked lists cross

本文介绍了一种判断两个无头节点链表是否交叉的方法。针对链表是否有环的不同情况,提供了相应的解决方案。通过实验验证了算法的有效性,并附带了完整的C++实现代码。

whether two headless linked lists cross

个人信息:就读于燕大本科软件工程专业 目前大三;

本人博客:google搜索“cqs_2012”即可;

个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;

博客内容:whether two headless linked lists cross;

博客时间:2014-4-20;

编程语言:C++ ;

编程坏境:Windows 7 专业版 x64;

编程工具:vs2008 32位编译器;

制图工具:office 2010 ppt;

硬件信息:7G-3 笔记本;


my worlds

keeping healthy is so important.

problem

check two headless linked lists cross.

solution

situation one: these lists  don't have a cycle

check they whether have ten same end.

	if( _Get_end(list1) != _Get_end(list2) )
		cout<<"the two list don't have the same end"<<endl;
	else cout<<"the two list have the same end"<<endl;

situation two: these lists have cycles


i will cut off one list, then check whether another is cut off. if another is cut off, then they cross, or not.

sub-problem: whether a linked list have a cycle.

just make two legs have different speeds, if they  meet, the list have a cycle, or not.

 


my experiments

situation one:

  

situation two:

	for(int i=1;i<10;i++)
	{
		p2->next = new node();
		p2 = p2->next;
		p2->data = i;
	}

	// second action: make list two,0,11-19
	for(int i=11;i<20;i++)
	{
		p1 -> next = new node();
		p1 = p1 -> next ;
		p1 -> data = i;
		if(i == 15)
		{
			p2 -> next = p1;
			p2 = p1;
		}
	}

	// third action: make cycle
	p1 -> next = p2 ;

result: cross

my code

test.cpp

#include<iostream>
#include<string>
using namespace std;


class node
{
public:
	int data;
	node * next;
	node(){
		data = 0;
		next = NULL;
	}
};


void _Output_list(node* L);
node * _Get_end(node * L);
bool _Cycle(node *L1);
bool _Cross(node * L1,node * L2);

// function: main
int main()
{
	node * list1 = NULL ,*list2 = NULL,*p1,*p2;
	p1 = list1 = new node();
	p2 = list2 = new node();

	// first action: make list one, 0-9,15-19
	for(int i=1;i<10;i++)
	{
		p2->next = new node();
		p2 = p2->next;
		p2->data = i;
	}

	// second action: make list two,0,11-19
	for(int i=11;i<20;i++)
	{
		p1 -> next = new node();
		p1 = p1 -> next ;
		p1 -> data = i;
		if(i == 15)
		{
			p2 -> next = p1;
			p2 = p1;
		}
	}

	// third action: make cycle
	p1 -> next = p2 ;

	//cout<<"list 1:"<<endl;
	//_Output_list(list1);
	//cout<<"list 2:"<<endl;
	//_Output_list(list2);

	cout<<_Cross(list1,list2)<<endl;

	system("pause");
	return 0;
}

void _Output_list(node* L)
{
	while(L != NULL)
	{
		cout<<L->data<<"\n";
		L = L->next ;
	}
	cout<<"list output over"<<endl;
}

node * _Get_end(node * L)
{
	while(L != NULL && L->next != NULL)
	{
		L = L->next;
	}
	if(L != NULL)
		return L;
	else return NULL;
}

bool _Cycle(node *L1)
{
	node * p1,*p2;
	p1 = p2 = L1;
	while(p1 != NULL && p2 != NULL)
	{
		p1 = p1->next;
		if(p2->next != NULL)
			p2 = (p2->next)->next;
		else return false;
		if(p1 == p2)
			return true;
	}
	return false;
}


bool _Cross(node * L1,node * L2)
{
	if(L1 != NULL && L2 != NULL)
	{
		bool c1 = _Cycle(L1);
		bool c2 = _Cycle(L2);
		if(!c1 && !c2)
		{
			if( _Get_end(L1) != _Get_end(L2) )
			{
				cout<<"the two list don't have the same end"<<endl;
				return true;
			}
			else {
				cout<<"the two list have the same end"<<endl;
				return false;
			}
		}
		else if(c1 && c2)
		{
			node * p1 = L1;
			node * p2 = L1->next;
			while(p1 != p2)
			{
				p1 = p1->next;
				p2 = p2->next->next;
			}
			node * newStart1 = p1 -> next;
			p1->next = NULL;

			if(_Cycle(L2) == true )
			{
				p1->next = newStart1;
				return false;
			}
			else 
			{
				p1->next = newStart1;
				return true;
			}

		}
		else return false;
	}
	else return false;
}



<think>我们正在解决用户遇到的“找不到'java'程序”的问题。根据用户描述,他们希望通过安装相关软件包来解决,例如default-jre、gcj-5-jre-headless等。同时,我们也参考了提供的引用内容,其中引用[1]和引用[2]都提到了类似的问题和解决方案。 步骤分析: 1. 根据引用[1]和引用[2]的信息,当用户尝试运行`java`命令时,系统提示该命令包含在多个软件包中,并建议安装其中一个。 2. 用户明确表示想通过安装这些包来解决,因此我们需要指导用户如何安装其中一个合适的包。 3. 在引用[2]中,用户尝试配置环境变量但未成功,后来通过修正环境变量解决了问题。但当前用户的需求是安装软件包,因此我们重点放在安装包上。 4. 引用[4]提供了另一种解决方案:使用`update-alternatives`命令来设置默认的java。但用户当前要求是安装包,所以我们先按安装包的方式来指导。 注意:在Linux系统中,不同的软件包对应不同的Java实现(OpenJDK、GCJ等)。用户可以根据需要选择其中一个。例如,如果想要OpenJDK 8,则安装openjdk-8-jre-headless。 然而,用户列出了多个包,我们需要明确:安装其中一个即可。通常推荐安装OpenJDK,因为它是常用的开源实现。 具体步骤: 1. 打开终端。 2. 更新软件包列表(可选,但推荐):`sudo apt update` 3. 选择一个包进行安装,例如安装default-jre(这是一个指向当前系统默认Java运行环境的包)或者指定版本的OpenJDK。 但是,根据引用[2]中的错误提示,系统列出了多个包,包括openjdk-8-jre-headless等。我们可以选择安装openjdk-8-jre-headless(这是OpenJDK 8的无头版本,适合服务器环境,不需要图形界面)。如果用户需要图形界面支持,可以安装openjdk-8-jre。 这里我们以安装openjdk-8-jre-headless为例: 执行命令: sudo apt install openjdk-8-jre-headless 等待安装完成即可。 4. 安装完成后,可以运行`java -version`来验证是否安装成功。 注意:如果系统中已经安装了多个Java版本,可以使用`update-alternatives`来设置默认的Java版本(如引用[4]所示),但通常安装一个包后,系统会自动将其设置为默认(如果之前没有安装其他Java版本)。 如果用户安装的是其他包,方法类似,只需替换包名。 另外,用户提到的包中有gcj(GNU Compiler for Java)和openjdk,一般推荐使用openjdk。 因此,回答用户时,我们建议安装openjdk-8-jre-headless(或用户指定的其他包),并提供安装命令。 考虑到用户的环境可能有差异(比如Ubuntu版本不同),包名可能略有不同。如果用户安装openjdk-8-jre-headless失败(比如找不到包),可以尝试安装default-jre(它会安装当前Ubuntu版本默认的Java版本)。 所以,我们可以给出两种方案: 方案一:安装特定版本的OpenJDK(例如openjdk-8-jre-headless) 方案二:安装default-jre(让系统选择默认的Java版本) 根据引用[1]和引用[2],用户系统列出的包中有openjdk-8-jre-headless,说明该包在用户的软件源中可用。 因此,我们指导用户安装openjdk-8-jre-headless,同时提供安装default-jre的备选方案。 最后,生成相关问题。 </think>### 解决找不到 'java' 程序的安装方法 在 Ubuntu 系统中,当终端提示`程序 'java' 已包含在下列软件包中`时,说明系统未检测到完整可用的 Java 环境。以下是安装推荐软件包的具体步骤: #### 方法 1:安装 OpenJDK(推荐) ```bash # 安装完整的 OpenJDK 8 环境(包含 JRE) sudo apt update sudo apt install openjdk-8-jre-headless # 无界面版(服务器适用) # 或安装带图形支持的版本 sudo apt install openjdk-8-jre ``` #### 方法 2:安装默认 JRE ```bash # 安装系统默认推荐的 Java 环境 sudo apt update sudo apt install default-jre ``` #### 方法 3:安装其他版本 GCJ ```bash # 例如安装 GCJ 5 sudo apt install gcj-5-jre-headless ``` #### 验证安装 ```bash java -version # 应显示类似:openjdk version "1.8.0_382" ``` > **关键注意事项** > 1. 安装后若仍报错,需检查环境变量配置(参考引用[2][4]) > 2. 使用`sudo update-alternatives --config java`可切换多版本 > 3. 避免手动解压 JDK 导致路径错误(如引用[2]案例) > 4. 优先选用`openjdk-8-jre-headless`或`default-jre`保证兼容性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值