题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
分析
本题的主要思路如下:
- 若链表为空则直接返回NULL;
- 否则,若链表只有1个元素,则直接返回链表本身;
- 否则,初始化一个结点node放置于链表头部,然后进入循环;
- 循环中front = node->next,若front为空结束循环,否则rear=front->next,若rear不为空且rear和front的键值相等,那么利用rear向前遍历直至找到值与front不等的结点,并node->next = rear,否则node指针向前移动;
github链接:JZ56-删除链表中重复的结点
C++代码
#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;
}
if(pHead->next == NULL){
return pHead;
}
ListNode* head = new ListNode(0);
head->next = pHead;
ListNode* tmp = head;
while(1){
ListNode* front = tmp->next;
if(front == NULL){
break;
}
ListNode* rear = front->next;
if(rear && rear->val == front->val){
while(rear && rear->val == front->val){
rear = rear->next;
}
tmp->next = rear;
}else{
tmp = tmp->next;
}
}
return head->next;
}
};
int main()
{
int n,val;
Solution s;
while(cin>>n){
ListNode* head = new ListNode(0);
ListNode* tmp = head;
for(int i = 0 ; i < n ; i++){
cin>>val;
ListNode* node = new ListNode(val);
head->next = node;
head = head->next;
}
head = tmp->next;
ListNode* head1 = s.deleteDuplication(head);
while(head1){
cout<<head1->val<<" ";
head1 = head1->next;
}
}
return 0;
}