讨论/题目交流/小白在线求助 链表问题 出错AddressSanitizer: heap-use-after-free/
小白在线求助 链表问题 出错AddressSanitizer: heap-use-after-free

**链表基础问题 奇偶链表 **
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

示例 1:

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:

输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
说明:

应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
以下是我写的代码

代码块class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if(!head) return NULL;
        if(!(head->next)) return head;
        ListNode *pre1=new ListNode(0);
        ListNode *pre2=new ListNode(-1);
        ListNode *l1,*l2;
       l1=pre1;l2=pre2;
        int i=1;
        while(head)
        {
            if(i%2!=0){l1->next=head;l1=l1->next;}
            else {l2->next=head;l2=l2->next;}
            head=head->next;
            i++;            
        }
        l1->next=pre2->next;           
        return pre1->next;
    }
};

执行出错,显示AddressSanitizer: heap-use-after-free on address 0x6020000000d8 at pc 0x0000003f3c6d bp 0x7fff03132960 sp 0x7fff03132958
这是为什么呢?我也没有delete pre1?

展开讨论
小白一枚发起于 2020-05-08
最近编辑于 2020-05-09

改一下就行了

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if(!head) return NULL;
        if(!(head->next)) return head;
        ListNode *pre1=new ListNode(0);
        ListNode *pre2=new ListNode(-1);
        ListNode *l1,*l2;
        l1=pre1;
        l2=pre2;
        int i=1;
        while(head)
        {
            if(i%2!=0){
                l1->next=head;
                l1=l1->next;
            }
            else {
                l2->next=head;
                l2=l2->next;
            }
            head=head->next;
            i++;            
        }
        l2->next=NULL; // *** 把这行加上就行了 ***
        /*
        1->2->3->4->5->NULL

        pre1 -> 1 -> 3 -> 5;
        pre2 -> 2 -> 4 -> 5;
        pre -> 1 -> 3 -> 5 -> 2 -> 4 ;
                         ^         | 
                         |         ▼
                          ---------- 
        应该是死循环了吧。我也不太清楚
        */
        l1->next=pre2->next;           
        return pre1->next;
    }
};

展开全部 2 讨论