题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
- 定义一个vector来保存不重复的结点,从初始结点开始,定义两个指针current和next,则判断两个结点的val是否相等,若相等,则next后移,直至找到一个不等于current值的结点,需要注意的是判断current和next是否为NULL,这种方法的缺点是最后一个结点会跳过,因此循环完成后需要再判断一次最后一个结点的值是否重复,通过last_value来判断。最后,将vector中的结点串起来即可
- 递归,其实思路类似
代码
方法一
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead == NULL)
return NULL;
vector<ListNode*> L_node;
ListNode* current = pHead;
int last_value;
while(current != NULL && current->next != NULL)
{
ListNode* next = current->next;
if(current->val!=next->val)
{
L_node.push_back(current);
last_value = current->val;
current = next;
}
else
{
while(current->val==next->val)
{
if(next->next == NULL)
{
next = NULL;
break;
}
else
{
next = next->next;
}
}
current = next;
}
}
if(current != NULL && current->val != last_value)
L_node.push_back(current);
if(L_node.size() == 0)
return NULL;
else
{
for(int i = 0; i < L_node.size()-1;i++)
{
L_node[i]->next = L_node[i+1];
}
L_node[L_node.size()-1]->next = NULL;
return L_node[0];
}
}
};
方法二:
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead==NULL)
return NULL;
if (pHead!=NULL && pHead->next==NULL)
return pHead;
ListNode* current;
if ( pHead->next->val==pHead->val){
current=pHead->next->next;
while (current != NULL && current->val==pHead->val)
current=current->next;
return deleteDuplication(current);
}
else {
current=pHead->next;
pHead->next=deleteDuplication(current);
return pHead;
}
}
};