while (p != nullptr) { ListNode *q = p->next; while (q != nullptr && q->data == p->data) { p->next = q->next; delete q; q = p->next; }
时间: 2023-05-26 17:02:10 浏览: 98
) { if (p->val == q->val) { p->next = q->next; delete q; q = p->next; } else { q = q->next; } } p = p->next; } return head; }
相关问题
#include <iostream> #include "listnode.h" using namespace std; /*struct listNode { listNode * prev, * next; int val; listNode(): val(0), prev(nullptr), next(nullptr){} listNode(int v, listNode *p, listNode *n): val(v), prev(p), next(n) { if (prev != nullptr) prev->next = this; if (next != nullptr) next->prev = this; } };*/ class OrderedList { protected: listNode * root; public: OrderedList(){root=new listNode();} ~OrderedList(){ listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){listNode*tmp=cur;cur=cur->next;delete tmp;} delete cur;} virtual void insert(int val)=0; void printList() const { listNode* cur=root; while(cur->prev!=nullptr)cur=cur->prev; while(cur!=nullptr){cout<<cur->val<<' ';cur=cur->next;} cout<<endl; } }; class AscendOrderedList:public OrderedList { public: AscendOrderedList(){root=new listNode();} ~AscendOrderedList(){ listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){listNode*tmp=cur;cur=cur->next;delete tmp;} delete cur;} void insert(int v) { if(root->next==nullptr&&root->prev==nullptr){root->val=v;return;} listNode* pre = root; while(pre->prev!=nullptr)pre=pre->prev; if(v<=pre->val){listNode*ins=new listNode();ins->val=v;ins->next=pre;return;} while (pre->next != nullptr && v > pre->val) { pre = pre->next; } listNode*a=pre->next; listNode*ins=new listNode(v, pre, pre->next); ins->prev=pre;ins->next=a; } }; class DescendOrderedList:public OrderedList { public: DescendOrderedList(){root=new listNode();} ~DescendOrderedList(){ listNode* cur=root; if(cur->prev!=nullptr)cur=cur->prev; if(cur!=nullptr){listNode*tmp=cur;cur=cur->next;delete tmp;} delete cur;} virtual void insert(int v){ if(root->next==nullptr&&root->prev==nullptr){root->val=v;return;} listNode*pre=root; while(pre->prev!=nullptr)pre=pre->prev; if(v>=pre->val){listNode*ins=new listNode();ins->val=v;ins->next=pre;return;} while(v<pre->val&&pre!=nullptr){pre=pre->next;} listNode*a=pre->next; listNode*ins=new listNode(v, pre, pre->next); ins->prev=pre;ins->next=a; } };输出错误
在代码中,构造函数和析构函数中的删除操作存在问题。在析构函数中,应该先删除链表中的节点,再删除root节点,否则会造成内存泄漏。同时,在构造函数中,应该将root节点的prev和next指针设为nullptr,否则会导致插入操作时出现问题。另外,在DescendOrderedList的insert函数中,应该先判断pre是否为nullptr,否则在pre为nullptr时会出现访问pre->val的错误。
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(0); ListNode* cur = dummy; while (l1 != nullptr && l2 != nullptr) { ListNode** pp = (l1->val < l2->val) ? &l1 : &l2; cur->next = *pp; cur = cur->next; *pp = (*pp)->next; } cur->next = (l1 == nullptr) ? l2 : l1; ListNode* ans = dummy->next; delete dummy; return ans; }
这段代码是合并两个有序链表的代码,可以用来将两个有序链表合并成一个有序链表。主要思路是通过比较两个链表的节点的大小,将较小的节点添加到结果链表中,直到其中一个链表为空。最后将另一个链表剩下的节点直接添加到结果链表的末尾即可。
具体解释可以看下面的注释:
```
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0); // 创建一个虚拟头节点
ListNode* cur = dummy; // cur 指向当前节点,初始时指向虚拟头节点
while (l1 != nullptr && l2 != nullptr) { // 当两个链表都非空时
ListNode** pp = (l1->val < l2->val) ? &l1 : &l2; // 找出较小的节点
cur->next = *pp; // 将较小的节点添加到结果链表中
cur = cur->next; // 更新当前节点为新加入的节点
*pp = (*pp)->next; // 将原链表中被添加的节点指针后移
}
cur->next = (l1 == nullptr) ? l2 : l1; // 将另一个非空的链表直接添加到结果链表末尾
ListNode* ans = dummy->next; // 记录结果链表的头节点
delete dummy; // 释放虚拟头节点的内存
return ans; // 返回结果链表的头节点
}
```
阅读全文