LeetCode 24. 两两交换链表中的节点
具体解题思路和答案可以参考:代码随想录: 24. 两两交换链表中的节点
自我错误思考过程记录:
✘ 错误代码:
//思路:
class Solution {
public:
ListNode* swapPairs(ListNode* head)
{
ListNode* dummyHead=ListNode(0);
dummyHead->next=head;
while(dummyHead->next->next!=nullptr&&dummyHead->next!=nullptr)
{
ListNode* temp1=dummyHead->next;
ListNode* temp3=dummyHead->next->next->next;
dummyHead->next=dummyHead->next->next; //头结点指向第二个
dummyHead->next->next=temp1; //第二个指向第一个
temp1->next=temp3; //第一个指向第三个
dummyHead=temp1->next;
}
return
}
};
✘ 错误分析:题目要求: 并返回交换后链表的头节点。 直接移动dummyHead的话 ,没有办法获取头结点了。
还有就是 new ListNode(0); 这样初始化一个节点。
还有一点:
while(curr->next!=nullptr&&curr->next->next!=nullptr)
如果 写成了
while(curr->next->next!=nullptr&&curr->next!=nullptr)
运行会报错。
这是因为
在 C++ 中,逻辑运算符 &&(与运算符)和 ||(或运算符)都具有短路求值的特性,即如果左边的条件表达式已经能够决定整个表达式的结果,则不再计算右边的条件表达式,直接返回结果。
如果 curr->next 或者 curr->next->next 为 nullptr,则左侧的条件表达式会被判断为 false,整个表达式的值为 false,不会再继续执行右侧的条件表达式。
拓展问题: C++的 C++的&存在短路求值的特性嘛?
在 C++ 中,单独的 & 运算符并不存在短路求值的特性。& 运算符是按位与运算符,它会对两个操作数的每一位进行与运算,并返回结果。例如,对于两个二进制数 A 和 B,A & B 的结果就是将 A 和 B 的每一位进行与运算后得到的新数。
相比之下,逻辑运算符 && 和 || 具有短路求值的特性。如果左侧条件为 false(对于 && 运算符)或者 true(对于 || 运算符),则不会继续计算右侧条件,直接返回结果。这个特性可以用来简化代码、提高效率,并且可以避免一些潜在的错误。
综上所述,C++中的&并没有短路求值的特性,如果想要实现短路求值,需要使用逻辑运算符&&或||
正确的写法应该用一个cur=dummyHead,保留dummyHead :
//思路:
class Solution {
public:
ListNode* swapPairs(ListNode* head)
{
ListNode* dummyHead=new ListNode(0);
dummyHead->next=head;
ListNode* curr=dummyHead;
while(curr->next!=nullptr&&curr->next->next!=nullptr)
{
ListNode* temp1=curr->next;
ListNode* temp3=curr->next->next->next;
curr->next=curr->next->next; //头结点指向第二个
curr->next->next=temp1; //第二个指向第一个
temp1->next=temp3; //第一个指向第三个
curr=curr->next->next;
}
return dummyHead->next;
}
};