代码随想录 代码随想录 链表-5
中等
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 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