Day4 两两交换链表中的节点 链表相交 环形链表

两两交换链表的节点

我们来看下面这三行代码,我们今天的任务就是彻底弄明白这个指针如下的含义,我认为在学习链表的过程中我个人认为最困难的地方就在于这个指针的使用,在我们最开始学完指针后,我们可能不是很熟练,但是当我发现,在我学完这个链表后,我对这个指针开始有了更深的印象。

下面由流星雨同学来讲解以下他的看法:首先对于第一行我们要做的是让cur的下一个指针指向cur的下下个节点。再让cur的下个节点的下一个节点为tmp再让cur的下下个节点的下个节点为tmp1 

  cur->next = cur->next->next; 
            cur->next->next = tmp;          
            cur->next->next->next = tmp1; 

 注释处是错误的,但是我们由此借鉴出它的,该找错,由此可以进一步提高自己,进步都是在不停的改正确!

#include<iostream>
using namespace std;
struct linklist
{
	linklist* next;
	int val;
	linklist(int x):next(nullptr),val(x){}
};
void liang_fz(linklist*start)
{
	/*linklist* vir = new linklist(0);
	vir->next = start;
	while (vir->next != nullptr && vir->next->next)
	{
		linklist* cur = vir->next;
		linklist* temp = vir->next->next->next;
		vir->next = vir->next->next;
		cur->next = temp;

	}
	start = vir->next;*/
	linklist* vir = new linklist(0);
	vir->next = start;
	linklist* cur = vir;
	//while (cur->next != nullptr && cur->next->next!=nullptr)
	//{
	//	linklist* temp = cur->next;
	//	linklist* temp2 = cur->next->next;
	//	vir->next = temp2;
	//	temp2->next = temp;

	//	cur = cur->next->next;
	//}
	while (cur->next != nullptr && cur->next->next != nullptr)
	{
		linklist* temp = cur->next;
		linklist* temp2 = cur->next->next->next;
	//one
		cur->next = cur->next->next;
	//two
		cur->next->next = temp;//由这一步可以看出temp的改变
		//命运的齿轮转动
	//three

		//temp->next = temp2;//其实这个地方我们可以发现这么写是不对的
		//因为我们此时的temp已经改变了 所以我们要利用
		//正确写法  
		cur->next->next->next = temp2;

		cur = cur->next->next;
	}
	start = vir->next;
	while (start != nullptr)
	{
		cout << start->val << " ";
		start = start->next;
	}
	delete vir;
}
int main()
{
	linklist* p1 = new linklist(2);
	linklist* p2 = new linklist(3);
	linklist* p3 = new linklist(4);
	linklist* p4 = new linklist(5);

	p1->next = p2;
	p2->next = p3;
	p3->next = p4;
	liang_fz(p1);
}

链表相交

这个代码比较简单好理解 

#include<iostream>
#include<algorithm>
using namespace std;
struct linklist
{
	linklist* next;
	int val;
	linklist(int x):next(nullptr),val(x){}
};
void jiao(linklist* start1,linklist*start2)
{
	int n1 = 0;
	int n2 = 0;
	linklist* ss1 = start1;
	linklist* ss2 = start2;
	while (ss1 != nullptr)
	{
		n1++;
		ss1 = ss1->next;//这个地方理解为赋值

	}
	while (ss2 != nullptr)
	{
		n2++;
		ss2 = ss2->next;
	}
	linklist* cur1 = start1;
	linklist* cur2 = start2;
	if (n1 < n2)
	{
		swap(cur1, cur2);
		//swap(start1, start2);要是这么写就不对了 你想啊 
		//你要是这么写那上面交换还有啥用啊
		swap(n1, n2);
	}
	int len = n1 - n2;
	while (len--)
	{
		cur1 = cur1->next;
	}
	while (cur1 != nullptr)
	{
		if (cur1 == cur2)
		{
			cout << "yes" << endl;
			return;
		}
		else
		{
			cur1 = cur1->next;
			cur2 = cur2->next;
		}
	}
	cout << "no";
	return;
}
int main()
{
	linklist* p1 = new linklist(1);
	linklist* p2 = new  linklist(2);
	linklist* p3 = new linklist(3);
	p1->next = p2;
	p2->next = p3;
	linklist* q1 = new linklist(2);
	linklist* q2 = new linklist(3);
	q1->next = q2;
	p2->next = q2;
	jiao(p1, q1);
}

环形链表

如何判断这个链表为环形链表?以及如何找到这个环形链表的入口?这个我会在我的小红书上直播时候讲

#include<iostream>
using namespace std;
struct linklist
{
	linklist* next;
	int val;
	linklist(int x):next(nullptr),val(x){}
};
void zhao_kou(linklist* start)
{
	linklist* slow = start;
	linklist* fast = start;
	while (fast != nullptr && fast->next != nullptr)
	{
		slow = slow->next;
		fast = fast->next->next;
		if (slow == fast)
		{
			linklist* jiao = slow;
			linklist* cur = start;
			while (jiao != cur)
			{
				jiao = jiao->next;
				cur = cur->next;

			}
			cout << cur->val << endl;
			return;
		}
	}
	cout << "no";
	return;
}
int main()
{
	linklist* p1 = new linklist(0);
	linklist* p2 = new linklist(1);
	linklist* p3 = new linklist(2);
	linklist* p4 = new linklist(3);
	p1->next = p2;
	p2->next = p3;
	p3->next = p4;
	p4->next = p2;
	zhao_kou(p1);
}

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值