非递归的代码:
- 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况
- 设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if (pHead==nullptr || pHead->next==nullptr){return pHead;} ListNode *Head = new ListNode(0); //初始化 Head->next = pHead; ListNode *pre = Head; ListNode *last = Head->next; while (last!=nullptr){ if(last->next!=nullptr && last->val == last->next->val){ // 找到最后的一个相同节点 while (last->next!=nullptr && last->val == last->next->val){ last = last->next; } pre->next = last->next; last = last->next; }else{ pre = pre->next; last = last->next; } } return Head->next; } };以下是自己所写代码,问题一直解决不了。
问题:
段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起点击对比用例标准输出与你的输出
case通过率为0.00%
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead==nullptr) return pHead; ListNode* StayNode=nullptr; ListNode *pNode=pHead,*theBeforeNode=nullptr,*theLastStayNode=nullptr; while(pNode!=nullptr){ if(theBeforeNode==nullptr && pNode->val!=pNode->next->val) StayNode=pNode; //第一个节点为保留节点 if(theBeforeNode!=nullptr && theBeforeNode->val!=pNode->val && pNode->val!=pNode->next->val){ if(StayNode!=nullptr){ theLastStayNode=StayNode; StayNode=pNode; theLastStayNode->next=StayNode; } else{ StayNode=pNode; } } if(theLastStayNode==nullptr && StayNode!=nullptr) pHead=StayNode; theBeforeNode=pNode; pNode=pNode->next; } StayNode->next=nullptr; return pHead; } };