《劍指offer》面試題57 刪除鏈表中重複的結點 C++ 實現 以及 錯誤總結 (指針問題)!!

自己在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 的動力


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章