题解 | #删除链表中重复的结点#

删除链表中重复的结点

http://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef

比较容易想到,但不容易写对:)

我的思路是,既然对链表做了修改,就索性新建一个,把符合条件的节点拷贝出来。所以问题就成了怎么找到符合条件的节点?

很明显,需要用到至少两个指针,用来判断相邻两个节点的值是否相等。然后设置一个标志位,保存上次判断相邻两个节点值相等的状态,然后向下遍历,每次不断更新和判断这个标志位,如果满足题目要求就拷贝出来。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(!pHead) return pHead;
        ListNode* pNewHead = nullptr;
        bool same = false;
        ListNode* pCur = pHead;
        ListNode* pNext = pHead->next;
        while(1){
            if(!pNext){
                if(!same){
                    pNewHead = add2New(pNewHead, pCur);
                }
                break;
            }
            if(pCur->val == pNext->val){
                same = true;
            }
            else{
                if(same){
                    same = false;
                }
                else{
                    pNewHead = add2New(pNewHead, pCur);
                }
            }
            pCur = pNext;
            pNext = pNext->next;
        }
        return pNewHead;
    }
    
    ListNode* add2New(ListNode* pNewHead, ListNode* newNode){
        if(!pNewHead){
            pNewHead = new ListNode(newNode->val);
            pNewHead->next = nullptr;
        }
        else{
            ListNode* added = new ListNode(newNode->val);
            added->next = nullptr;
            ListNode* pTail = pNewHead;
            while(pTail->next){
                pTail = pTail->next;
            }
            pTail->next = added;
        }
        return pNewHead;
    }
};
全部评论

相关推荐

这一集 硕士输的很惨
HoePointer:普通硕士的悲哀,高的进不去,低的要不起
点赞 评论 收藏
分享
每晚夜里独自颤抖:这个在牛客不是老熟人了吗
点赞 评论 收藏
分享
白火同学:大二有这水平很牛了,可以适当对关键信息加粗一点,比如关键技术、性能指标之类的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务