LeetCode 24. 两两交换链表中的节点

Posted 章章的魔法小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 24. 两两交换链表中的节点相关的知识,希望对你有一定的参考价值。

24. 两两交换链表中的节点 力扣题目跳转链接



具体解题思路和答案可以参考:代码随想录: 24. 两两交换链表中的节点

自我错误思考过程记录:

&#10008 错误代码:

 //思路:  
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  
    
;

&#10008 错误分析:题目要求: 并返回交换后链表的头节点。 直接移动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;
    
;

以上是关于LeetCode 24. 两两交换链表中的节点的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode] 24. 两两交换链表中的节点

LeetCode ——24. 两两交换链表中的节点

leetcode 24 - 两两交换链表中的节点

链表-LeetCode24两两交换链表中的节点

LeetCode 24.两两交换链表中的节点

leetcode 24 两两交换链表中的节点