删除链表中重复的节点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题思路:
使用三个指针:preNode指向值没有重复的最后一个节点、nowNode当前的节点、nextNode当前节点的下一个节点。
最开始preNode和nowNode指向头结点,判断nextNode与nowNode当前节点值是否一致,(1)如果一致说明头结点需要改变,我们找到第一个跟头结点值不同的节点,然后将头结点、preNode和nowNode都指向该节点;(2)如果不一致说明头结点没有重复,此时preNode和nowNode都指向头结点,需要让nowNode指向nextNode。
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
ListNode *preNode, *nowNode, *nextNode;
preNode = pHead;
nowNode = pHead;
nextNode = NULL;
while(nowNode != NULL){
nextNode = nowNode->next;
if(nextNode != NULL){
if(nextNode->val == nowNode->val){
while(nextNode != NULL && nextNode->val == nowNode->val){
nextNode = nextNode->next;
}
if(preNode == nowNode){
//头结点需要改变
pHead = nextNode;
preNode = nextNode;
nowNode = nextNode;
}else{
//删掉中间的重复节点
preNode->next = nextNode;
nowNode = nextNode;
}
}else{
//移动preNode节点到当前节点,nowNode节点指向下一个和当前节点值不同的节点
if(nowNode != preNode){
preNode = nowNode;
nowNode = nextNode;
}else{
//当前节点指向下一个和当前节点值不同的节点
nowNode = nextNode;
}
}
}else{
break;
}
}
return pHead;
}
};
学学学 练练练 刷刷刷

浙公网安备 33010602011771号