• 【剑指offer】删除链表中重复的结点


    题目链接:删除链表中重复的结点

     

    题意:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

     

    题解:感觉也是数据结构里的常见题。如果找到当前节点的重复节点,就找到它最后一个重复节点。然后用它前一个节点指向它最后一个重复节点的下一个节点即可。考虑一下首元素为重复节点的特殊情况就行了,只需要把头指针更新。

     

    代码:

     1 /*
     2 struct ListNode {
     3     int val;
     4     struct ListNode *next;
     5     ListNode(int x) :
     6         val(x), next(NULL) {
     7     }
     8 };
     9 */
    10 class Solution {
    11 public:
    12     ListNode* deleteDuplication(ListNode* pHead){
    13         if(pHead == NULL)    return NULL;
    14         ListNode* pre = NULL;
    15         ListNode* cur = pHead;
    16         ListNode* pnext = NULL;
    17         
    18         while(cur != NULL){
    19             //当前节点和下一个节点相同
    20             if(cur->next != NULL && cur->val == cur->next->val){
    21                 pnext = cur->next;
    22                 while(pnext->next != NULL && pnext->next->val == cur->val){
    23                     pnext =pnext->next;     //一直找到不相同。
    24                 }
    25                 //如果指向第一个节点,就删除
    26                 if(cur == pHead)    pHead = pnext->next;
    27                 else    pre->next = pnext->next;    //否则就指向下一个
    28                 cur = pnext->next;    //向前走
    29             }
    30             else{    //不相同就向前走
    31                 pre = cur;
    32                 cur = cur->next;
    33             }
    34         }
    35         
    36         return pHead;
    37     }
    38 };
  • 相关阅读:
    斐波那契数列
    用两个栈实现队列
    从尾到头打印链表
    HDOJ5877(dfs序+离散化+树状数组)
    HDOJ5876(补图的最短路)
    POJ3090(欧拉函数)
    POJ2478(欧拉函数)
    POJ2407(欧拉函数)
    POJ2142(扩展欧几里得)
    POJ3020(最小边覆盖)
  • 原文地址:https://www.cnblogs.com/Asumi/p/12423483.html
Copyright © 2020-2023  润新知