非递归的代码:
- 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况
- 设置 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;
}
}; 

京公网安备 11010502036488号