两两交换链表的节点
我们来看下面这三行代码,我们今天的任务就是彻底弄明白这个指针如下的含义,我认为在学习链表的过程中我个人认为最困难的地方就在于这个指针的使用,在我们最开始学完指针后,我们可能不是很熟练,但是当我发现,在我学完这个链表后,我对这个指针开始有了更深的印象。
下面由流星雨同学来讲解以下他的看法:首先对于第一行我们要做的是让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);
}