题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题目分析:
该题主要需要考虑三种情况,
(1)1->2->3->3->4->4->5 连续重复节点
(2)2->2->3->3->4->4->5 头节点连续需要删除
(3)1->2->3->3->4->4->4 尾节点重复需要删除
基于上述情况,有可能需要删除头结点,所以我们需要定义一个临时节点(temp_node)连入该链表,同时结合双指针。先初始化三个指针,temp_node->next = head; pre = cur = temp_node;为解决连续重复问题,我们先遍历到重复节点的最后一个节点,然后下移一个节点,再次判断是否重复,不重复的话,在赋给pre,同时pre = pre->next; 直到cur为空,结束。
最后代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <list>
#include <unordered_map>
#include <cstring>
#include <map>
#include <stdexcept>
using namespace std;
struct node
{
int val;
struct node *next;
};
class MyClass
{
public:
struct node* delete_r_node(struct node *pnode)
{
if (pnode == NULL || pnode->next == NULL)
return pnode;
struct node *temp_node = new node;
struct node *cur = temp_node;
struct node *back = temp_node;
temp_node->next = pnode; //建立临时头结点
while (back != NULL)
{
while (back->next != NULL && back->val == back->next->val)
{
back = back->next;
}
back = back->next;
if (back != NULL && back->next != NULL && back->val == back->next->val)
{
continue;
}
cur->next = back;
cur = cur->next;
}
return temp_node->next;
}
};
int main()
{
MyClass my_class;
node node6 = { 3, NULL };
node node5 = { 3, &node6 };
node node4 = { 3, &node5 };
node node3 = { 2, &node4 };
node node2 = { 2, &node3 };
node node1 = { 1, &node2 };
struct node* res_node = my_class.delete_r_node(&node1);
while (res_node != NULL)
{
cout << res_node->val << endl;
res_node = res_node->next;
}
system("pause");
return 0;
}