zoukankan      html  css  js  c++  java
  • 剑指offer-面试题18-删除链表中重复的节点-链表

    /*
    题目:
    	删除链表中重复的节点
    */
    /*
    思路:
    	1、声明一个头节点head,即使首元节点被删除,也可返回head->next
    	2、声明两个指针,
    		一个指针qNode指向确定不会删除的链表的最后一个节点,
    		一个指针pNode指向遍历的节点。
    	3、记录前一个节点的preVal,直到找到与preVal不同的节点,删除中间节点。
    	4、声明一个flag,指示当前节点之前的节点是否为重复节点。
    */
    
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<cmath>
    #include<stdio.h>
    using namespace std;
    
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
            val(x), next(NULL) {
        }
    };
    
    ListNode* deleteDuplication(ListNode* pHead)
    {
        //当链表长度为0或1时
        if(!pHead || !(pHead->next)) return pHead;
    
        //声明头节点,统一操作
        ListNode* head = new ListNode(0);
        head->next = pHead;
        int preVal = pHead->val;
        ListNode* qNode = head;//已确认的节点
        ListNode* pNode = pHead->next;//工作节点
        bool flag = false;
        while(pNode){
            if(pNode->val != preVal){
                if(flag){
                    ListNode* deleteNode = qNode->next;
                    ListNode* temp = nullptr;
                    while(deleteNode != pNode){
                        temp = deleteNode->next;
                        delete deleteNode;
                        deleteNode = temp;
                    }
                    flag = false;
                    qNode->next = pNode;
                }else{
                    while(qNode->next != pNode){
                        qNode = qNode->next;
                    }
                }
                preVal = pNode->val;
            }else{
                flag = true;
            }
            pNode = pNode->next;
        }
        if(flag){
            ListNode* toBeDelete = qNode->next;
            qNode->next = nullptr;
            ListNode* temp = nullptr;
            while(toBeDelete){
                temp = toBeDelete->next;
                delete toBeDelete;
                toBeDelete = temp;
            }
        }
        return head->next;
    }
    
    
    int main(){
        ListNode* node1 = new ListNode(2);
        ListNode* node2 = new ListNode(1);
        ListNode* node3 = new ListNode(1);
        node1->next = node2;
        node2->next = node3;
        ListNode* head = deleteDuplication(node1);
        while(head){
            cout<<head->val<<" ";
            head = head->next;
        }
    }
    

       

  • 相关阅读:
    H.264 RTP PAYLOAD 格式
    ARM:移动GPU往PC GPU效能迈进
    汪墩一中复校设想
    jconsole 和jvisualVM 监控远程 spring boot程序
    jenkins 登录远程机器并执行脚本,脚本中有后台执行的程序无法执行解决方法。
    linux下的抓包工具tcpdump
    adb logcat查看某个进程的输出日志
    Flask-SQLAlchemy 中多表链接查询(不使用外键)
    使用cnpm 安装vue.js
    Jmeter在非GUI环境下传递参数(命令行&Jenkins配置)
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11885493.html
Copyright © 2011-2022 走看看