关闭

《剑指offer》面试题57 删除链表中重复的结点 C++ 实现 以及 错误总结 (指针问题)!!

144人阅读 评论(0) 收藏 举报
分类:
自己在VS里写了完整代码!! 才知道自己犯的下面第一个错!!
(1)
一直错在39行,在外面的VS软件里才调出来了!!
while(p2->val==p3->val&&p3!=NULL)
   p3=p3->next;
    
这句话这么写,就出错了,如果p3的值是NULL,
进入下一次的while()的条件判断,
会先进行 p2->val==p3->val,这里的 p3->val就会报错了   
 
(2)(好像之前也错过!!)
牛客网上结构体的初始化 是这么写的: 
ListNode *newHead=new ListNode(0)
并不是 ListNode *newHead(0);!!!!!!

总算解决了!!
-----------------------牛客网 Code---------------------------------------
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead==NULL)return NULL;
        ListNode* p2=pHead;
        ListNode* p3=NULL; 
        
        ListNode *newHead=new ListNode(0),*newp=newHead;
        //newHead->val=0;
       // newHead->next=NULL;
         
        while(p2!=NULL)
        {
            p3=p2->next;
            
           if(p3==NULL)//最后一个结点,就不能像32行 可以进行对比
            {//链接到新表中
               newp->next=p2;
               newp=newp->next;
               newp->next=NULL;
               p2=p2->next;
            }
           else
           { 
            	if(p2->val==p3->val)
            	{
                	/*while(p2->val==p3->val&&p3!=NULL)
                    p3=p3->next;
               	 	 if(p3==NULL)p2=NULL;
               		 if(p2->val!=p3->val) p2=p3;  */
                    
                    while(p3!=NULL)
                    {
			if(p2->val==p3->val){p3=p3->next;}
			else break;
		     }
               	 	 if(p3==NULL)p2=NULL;
		         else { if(p2->val!=p3->val) p2=p3;   }   
                    
            	}
                else 
                 {//链接到新表中
              		 newp->next=p2;
               		 newp=newp->next;
              		 newp->next=NULL;
              		 //p2=p2->next;
                     p2=p3;
                }
           }
      }         
        return newHead->next;
    }
    
};

-----------------------VS 软件上调试 Code--------------------------------

#include<iostream>
using namespace std;
  
struct ListNode {
    int val;
    struct ListNode *next;  
}*pHead;
 
void creat(ListNode * &pHead)
{
     int a[8]={1,3,3,3,3,5,5,5};
     int n=8;
    //int a[1]={2};
    //int n=1;
 
    pHead= new ListNode;
    pHead->val=a[0];
    pHead->next=NULL;
     
    ListNode *p=pHead;
    for(int i=1;i<n;i++)
    {
        ListNode *t=new ListNode;
        t->val=a[i];
        t->next=NULL;
 
        p->next=t;
        p=p->next;      
    }
     
     
}
void output(ListNode * &pHead)
{
    ListNode *p=pHead;
    while(p!=NULL)
    {
        cout<<p->val;
        p=p->next;
    }
    cout<<endl;
}
 
 ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead==NULL)return NULL;
        ListNode* p2=pHead;
        ListNode* p3=NULL;
         
        ListNode *newHead=new ListNode,*newp=newHead;
        newHead->val=-1;
        newHead->next=NULL;
          
        while(p2!=NULL)
        {
            p3=p2->next;
             
           if(p3==NULL)//最后一个结点,就不能像32行 可以进行对比
            {//链接到新表中
               newp->next=p2;
               newp=newp->next;
               newp->next=NULL;
 
               p2=p2->next;
            }
           else
           {
                if(p2->val==p3->val)
                {
                    //while(p2->val==p3->val&&p3!=NULL)
                    int k=0;
                    while(p3!=NULL)
                    {
                        if(p2->val==p3->val){p3=p3->next;}
                        else break;
                    }
 
                     if(p3==NULL)p2=NULL;
                     else { if(p2->val!=p3->val) p2=p3;   }            
                }
                 else
                 {//链接到新表中
                     newp->next=p2;
                     newp=newp->next;
                     newp->next=NULL;
                    // p2=p2->next;
                     p2=p3;
                }
           }
      }        
        return newHead->next;
    }
 
void main()
{
      
   ListNode * pHead=NULL;
   creat(pHead);
 
   ListNode * pH=NULL;
   pH=deleteDuplication(pHead);
   output(pH); 
 
    system("pause");
}


好爱奈何羡慕 我coding 的动力


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11015次
    • 积分:363
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:9篇
    • 译文:4篇
    • 评论:1条
    最新评论