zoukankan      html  css  js  c++  java
  • 删除链表中重复的结点(C++)

    本来挺容易的一道题,做起来就有很多问题,解决了之后,也感觉到自己的一些进步

    首先要排除一些好解决的问题,链表结点就容易出现一些问题

    最重要的就是当headPtr节点为NULL了,这时候就退出了,但是headBefore的值可能还要放入ret链表中去

    在最后headPtr和headBefore两个节点的值比较的过程之中,分两个的值相等与不相等,进行后续处理得出最后的结果

    首先ret:指向返回链表首结点

    retPtr:指向返回链表的末尾节点,用来增长链表

    pHeadPtr:指向pHead链表,用来移动判断

    pHeadBefore:指向pHead链表,用来与pHeadPtr判断出来不想等的值,就把这个值产生新的节点加入ret

    总体思路就是

    1、先讨论链表为NULL的和链表只有一个结点的,将这两种情况排除之后,就是判断值pHeadBefore->value和pHeadPtr->value是否相等

    2、不相等,就加入pHeadBefore->value;相等就移动pHeadPtr,直到不相等,使得pHeadBefore=pHeadPtr,pHeadPtr=pHeadPtr->next

    代码如下:

    #include<iostream>
    using namespace std;
    
    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* ret = NULL;
        	// 
    		ListNode* retPtr = NULL;
    		//现链表的前一个节点 
    		ListNode* pHeadBefore = pHead;
    		//指向现节点 
    		ListNode* pHeadPtr = pHead->next;
    		//retPtr = ret;
    		while (pHeadPtr != NULL)
    		{
    			if (pHeadPtr->val != pHeadBefore->val)
    			{
    				if (ret == NULL)
    				{
    					ret = new ListNode(pHeadBefore->val);
    					retPtr = ret;
    				} else {
    					retPtr->next = new ListNode(pHeadBefore->val);
    					retPtr = retPtr->next;
    				}
    				pHeadBefore = pHeadPtr;
    				pHeadPtr = pHeadPtr->next;
    				if (pHeadPtr == NULL)
    				{
    					retPtr->next= new ListNode(pHeadBefore->val);
    				}
    			} else {
    				while(pHeadPtr != NULL && pHeadPtr->val == pHeadBefore->val)
    				{
    					pHeadPtr = pHeadPtr->next;
    				}
    				if (pHeadPtr != NULL)
    				{
    					pHeadBefore = pHeadPtr;
    					pHeadPtr = pHeadPtr->next;	
    					if (pHeadPtr == NULL)
    					{
    						if (ret != NULL)
    						{
    							retPtr->next = new ListNode(pHeadBefore->val);
    						}
    					}
    				}		
    			}
    		}
    		if (ret == NULL)
    		{
    			//只有一个节点的情况 
    			if (pHeadBefore->next == NULL)
    			{
    				return new ListNode(pHeadBefore->val);
    			}	
    		}
    		return ret;
        }
    };
    void printListNode(ListNode* root)
    {
    	if (root == NULL)
    	{
    		cout<<"NULL"<<endl; 
    	}
    	while (root != NULL)
    	{
    		cout<<root->val<<" ";
    		root = root->next;
    	}
    	cout<<endl;
    }
    int main()
    {
    	ListNode l1(1);
    	ListNode l2(2);
    	ListNode l3(3);
    	ListNode l4(3); 
    	ListNode l5(4);
    	ListNode l6(4);
    	ListNode l7(5);
    	l1.next = &l2;
    	l2.next = &l3;
    	l3.next = &l4;
    	l4.next = &l5;
    	l5.next = &l6;
    	l6.next = &l7;
    	printListNode(&l1);
    	printListNode(Solution().deleteDuplication(&l1));
    	return 0;
    }
    

      

  • 相关阅读:
    JDOJ 2430: 组合数取模
    USACO Dual Palindromes
    洛谷 P1365 WJMZBMR打osu! / Easy
    洛谷 P6154 游走
    洛谷 P1654 OSU!
    洛谷 P3802 小魔女帕琪
    洛谷 P1784 数独
    POJ King Arthur's Birthday Celebration
    洛谷 P4550 收集邮票
    洛谷 SP1026 FAVDICE
  • 原文地址:https://www.cnblogs.com/adamhome/p/8075774.html
Copyright © 2011-2022 走看看