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

来源:互联网 发布:淘宝达人的网址 编辑:程序博客网 时间:2024/06/04 23:32
自己在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
原创粉丝点击