剑指offer:删除重复的节点

来源:互联网 发布:文字录入 网络兼职 编辑:程序博客网 时间:2024/05/22 15:27
// 删除链表的重复节点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的时候就需要将这次不重复的节点赋值给prepHead = 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 nullreturn 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;}

0 0
原创粉丝点击