// 删除链表的重复节点fanal.cpp : 定义控制台应用程序的入口点。
//题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,
// 重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
//解题思路:先在草稿纸上画出几种可能的情况(头结点可能会改变的情况),分析后可知,需要三个指针
// 分别指向这次的节点,下一个节点,上一次的节点(需要将上次不重复的节点指向这一次不重复的节点上)
// 然后循环这次的节点进行判断就行了。
#include "stdafx.h"
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead == NULL)
return pHead;
ListNode* cur = pHead; //当前节点
ListNode* pre = NULL; //上一个节点
ListNode* next = NULL;//下次的节点
while (cur != NULL) {
next = cur->next; //下一个节点的赋值
if (next != NULL && cur->val == next->val) { //当发现重复节点的时候
while (next != NULL && cur->val == next->val) { //因为可能有多个重复的节点
next = next->next; //一直找到下个不为这个的值
}
cur = next; //将当前节点赋值为不重复的值
if (pre != NULL) //如果pre不为NULL,就需要将pre指向这次节点
pre->next = cur; //虽然可能会重复,但下次会再次进行判断
}
else {
if (pre == NULL) { //pre为NULL的时候就需要将这次不重复的节点赋值给pre
pHead = cur; //将head也要重新赋值,防止头指针就重复
pre = cur;
}
else {
pre->next = cur; //pre不为null的时候,就需要将pre的next指向这次的cur,将链表链接起来
pre = cur; //pre为这次的节点了
}
cur = cur->next; //遍历下个节点
}
}
if (pre == NULL) //如果全部都是重复的节点,pre为NULL,return null
return NULL;
return pHead;
}
int main()
{
ListNode* head;
ListNode* tmp1 = new ListNode(1);
head = tmp1;
ListNode* tmp2 = new ListNode(1);
ListNode* tmp3 = new ListNode(1);
ListNode* tmp4 = new ListNode(1);
ListNode* tmp5 = new ListNode(1);
ListNode* tmp6 = new ListNode(1);
ListNode* tmp7 = new ListNode(1);
ListNode* tmp8 = new ListNode(5);
tmp1->next = tmp2;
tmp2->next = tmp3;
tmp3->next = tmp4;
tmp4->next = tmp5;
tmp5->next = tmp6;
tmp6->next = tmp7;
tmp7->next = tmp8;
ListNode* tm = deleteDuplication(head);
return 0;
}
剑指offer:删除重复的节点
最新推荐文章于 2020-10-04 00:08:22 发布