今天的刷题最大的收获,便是学会了在群里跟大家进行讨论,这样得到的答案,往往能更快的提高效率,希望自己能继续坚持下去。
L24. 两两交换链表中的节点https://leetcode.cn/problems/swap-nodes-in-pairs/submissions/
本题主要考虑双指针法,也就是如何判断虚拟节点不动的情况,这是一个难点,可以利用另一个节点来等于虚拟节点,然后再利用两个局部变量,来完成还原,这样虚拟节点还是没有变,但是其指向的值会发生变化,以后返回某个值,只需要将虚拟节点固定,利用一个值来取代该值,对该值进行变化即可
class Solution {
public:
ListNode* swapPairs(ListNode* head)
{
//定义一个虚拟结点
//将就一个点,保证一个点不动,也就是虚拟节点一直要有一个值等待着,不能让他随着一起动
//不能三指针,两指针就好了
ListNode* vir = new ListNode(0, head);
ListNode* temp1 = NULL;
ListNode* temp2 = NULL;
ListNode* result = vir;
//result->next;//将头结点给cur
//ListNode* pre = result->next->next;//将头结点下一节点给pre
while (result->next!=NULL && result->next->next != NULL)
{
temp1 = result->next->next->next;//记录跳过两个节点的第一个点就好了
//现在开始进行交换
temp2 = result->next;
result->next = result->next->next;
result->next->next = temp2;
result->next->next->next = temp1;
result = result->next->next;
}
return vir->next;
}
};
L19.删除链表的倒数第N个节点 24. 两两交换链表中的节点 - 力扣(LeetCode)
本题注重采用双指针的方式
一开始自己卡在指针的跳转,这一块有点迷,后面一点一点的也就想出来了,还是简单的一个交换法,交换两指针
class Solution {
public:
ListNode* swapPairs(ListNode* head)
{
//定义一个虚拟结点
//将就一个点,保证一个点不动,也就是虚拟节点一直要有一个值等待着,不能让他随着一起动
//不能三指针,两指针就好了
ListNode* vir = new ListNode(0, head);
ListNode* temp1 = NULL;
ListNode* temp2 = NULL;
ListNode* result = vir;
//result->next;//将头结点给cur
//ListNode* pre = result->next->next;//将头结点下一节点给pre
while (result->next!=NULL && result->next->next != NULL)
{
temp1 = result->next->next->next;//记录跳过两个节点的第一个点就好了
//现在开始进行交换
temp2 = result->next;
result->next = result->next->next;
result->next->next = temp2;
result->next->next->next = temp1;
result = result->next->next;
}
return vir->next;
}
};
L面试题 02.07. 链表相交 https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/
本题虽然很简单,但是自己犯了一个错误,那便是对每个指针的一个值进行了修改,也怪自己没有深刻理解链表的一个定义
此外自己在本次中,第一次使用了一个模版,以前都是只相关性的学习过,并未真正意义上的使用过
class Solution {
public:
template<typename T>
void Swap(T& A, T& B)
{
T temp = A;
A = B;
B = temp;
}
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
int sizeA = getList(headA);
int sizeB = getList(headB);
ListNode* curA = headA;
ListNode* curB = headB;
if (sizeB > sizeA)
{
swap(sizeA, sizeB);
swap(curA, curB);
}
int subsize = sizeA - sizeB;
while (subsize--)
{
curA = curA->next;
}
while (curA != NULL)
{
if (curA == curB)
{
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
//得到链表的长度
int getList(ListNode* list)
{
ListNode* solve = new ListNode(0);
solve->next = list;
while (solve->next != NULL)
{
solve->val++;
solve = solve->next;
}
return solve->val;
}
};
class Solution {
public:
template<typename T>
void Swap(T& A, T& B)
{
T temp = A;
A = B;
B = temp;
}
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
int sizeA = getList(headA);
int sizeB = getList(headB);
ListNode* curA = headA;
ListNode* curB = headB;
if (sizeB > sizeA)
{
Swap(sizeA, sizeB);
Swap(curA, curB);
}
int subsize = sizeA - sizeB;
while (subsize--)
{
curA = curA->next;
}
while (curA != NULL)
{
if (curA == curB)
{
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
//得到链表的长度
int getList(ListNode* list)
{
ListNode* solve = new ListNode(0);
solve->next = list;
int size = 0;
while (solve->next != NULL)
{
size++;
solve = solve->next;
}
return size;
}
};
L142.环形链表IIhttps://leetcode.cn/problems/swap-nodes-in-pairs/、
本题的结题思路真的有被惊艳到,卡哥的思路真的无敌
首先自己想了一下,可以判断出是否有环,但是无法找到起点,果然一切的理论都得建立在数学基础上,然后在卡哥的这一段代码处,思考了一会,发现跳转两个节点,那就得判断当前节点和下一节点都不为空,这样才能保证后面进行跳转的时候不会出错,就算fast->next->next为空,也没关系,这样才会跳出循环,之所以这样写,也算是避免有单个节点的链表
while (fast != NULL && fast->next != NULL)
最后代码全是照着卡哥的写的,在这就不放了文章来源:https://www.toymoban.com/news/detail-443184.html
总结:通过对卡哥链表的学习,确实学到很多东西,在录友群里交流也学会很多,果然一个学习效率永远低于一群人的学习效率,希望二刷的时候,能学到更多的知识点。文章来源地址https://www.toymoban.com/news/detail-443184.html
到了这里,关于力扣刷题|L24. 两两交换链表中的节点 、L19.删除链表的倒数第N个节点 、L面试题 02.07. 链表相交 、L142.环形链表II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!