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

代码随想录 代码随想录 链表-5

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

中等

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:


输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:

输入:head = []
输出:[]
示例 3:

输入:head = [1]
输出:[1]
 

提示:

链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100

 方法1:

(1)自己的

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head == nullptr) return NULL;
        ListNode* dummy_head = new ListNode(0);//存最后返回的哨兵
        dummy_head->next = head;   

        ListNode* right = head->next;
        ListNode* left = head;
        ListNode* next_left; //存下一次变换的左指针
        ListNode* dummy = dummy_head; //存变换后的左指针          
        
        while(left!=nullptr && right!=nullptr){

            dummy->next = right;

            next_left = right->next;
            left->next = next_left;
            right->next = left;
            
            if(next_left!=nullptr){
                dummy = left;//草稿1 就是没有更新dummy,dummy要放next_left的前一个位置,即left
                right = next_left->next;
                left = next_left;
            }else break;
        }

        
        return dummy_head->next;
    }
};

 草稿1:会报错,错误地方不仅有内存的问题,还有根本没法完成任务

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head == nullptr) return NULL;
        
        ListNode* right = head->next;
        ListNode* left = head;
        

        ListNode* dummy_head = new ListNode(0);//存最后返回的哨兵
        dummy_head->next = head;

        //ListNode* dummy = dummy_head; //存变换后的左指针  
        
        //ListNode* next_left; //存下一次变换的左指针
        //ListNode* next_left;
        
        while(left && right){

            ListNode* dummy = left;

            ListNode* next_left = right->next;
            left->next = next_left;
            right->next = left;
            
            dummy->next = right;
            
            
            if(next_left!=nullptr){
                right = next_left->next;
                left = next_left;
            }else break;
        }

        
        return dummy_head->next;
    }
};

=================================================================
==42==ERROR: AddressSanitizer: heap-use-after-free on address 0x602000000058 at pc 0x00000037aa9d bp 0x7ffe0bd32c60 sp 0x7ffe0bd32c58
READ of size 8 at 0x602000000058 thread T0
    #2 0x7f647999c082  (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
0x602000000058 is located 8 bytes inside of 16-byte region [0x602000000050,0x602000000060)
freed by thread T0 here:
    #3 0x7f647999c082  (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
previously allocated by thread T0 here:
    #4 0x7f647999c082  (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
Shadow bytes around the buggy address:
  0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c047fff8000: fa fa fd fa fa fa fd fa fa fa fd[fd]fa fa fd fd
  0x0c047fff8010: fa fa 00 00 fa fa 00 00 fa fa 00 00 fa fa fd fd
  0x0c047fff8020: fa fa fd fd fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==42==ABORTING

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值