• c++刷题(9/100):链表


    题目一:https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

    题目描述

    输入一个链表,从尾到头打印链表每个节点的值。
    思路:之前看到书上两个链表相加然后(从tail开始)就发现这种从尾部开始的情况都可以用栈来实现,很容易理解,这题也一样
    /**
    *  struct ListNode {
    *        int val;
    *        struct ListNode *next;
    *        ListNode(int x) :
    *              val(x), next(NULL) {
    *        }
    *  };
    */
    class Solution {
    public:
        vector<int> printListFromTailToHead(ListNode* head) {
            vector<int> list ;
            stack<int> s ;
            while(head!=NULL){
                s.push(head->val) ;
                head = head->next ;
            }
            while(!s.empty()){
                list.push_back(s.top()) ;
                s.pop() ;
            }
            return list ;
        }
    };

    题目二:

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

    思路:如果保留重复的节点就很简单,不保留的话,每次向后遍历删完节点之后还要把之前的第一个节点删了,需要判断一下,如果被删的是头节点,还要判断一下。

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
            val(x), next(NULL) {
        }
    };
    */
    class Solution {
    public:
        ListNode* deleteDuplication(ListNode* pHead)
        {
            if(pHead==NULL) {return NULL;}
            set<int> s ;
            ListNode* cur = pHead ;
            ListNode* pre = pHead ;
            ListNode* check  ;
            ListNode* checkpre  ;
            bool firstTodel ;
            while(cur!=NULL){
                int temp = cur->val ;
                check = cur->next ;
                checkpre = cur ;
                firstTodel = false ;
                while(check!=NULL){
                    if(check->val==temp){
                        checkpre->next = check->next ;
                        firstTodel = true ;
                    }else{
                        checkpre = check ;
                    }
                    check = check->next ;
                }
                if(firstTodel){
                    if(cur==pHead){
                        pHead = pHead->next ;
                        pre = pre->next ;
                    }else{
                        pre->next = cur->next ;
                    }
                }else{
                    pre = cur ;
                }
                cur = cur->next ;
            }
            return pHead ;
        }
    };

    题目三:

    题目描述

    一个链表中包含环,请找出该链表的环的入口结点。
    思路:一开始想到set,后面觉得不行,因为可能会有两个一样的node,然后百度知道了双指针的方法。
    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
            val(x), next(NULL) {
        }
    };
    */
    class Solution {
    public:
        ListNode* EntryNodeOfLoop(ListNode* pHead)
        {
            ListNode* fast ;
            ListNode* slow ;
            fast = pHead ;
            slow = pHead ;
            if(fast==NULL){
                return NULL ;
            }
            while(fast!=NULL&&fast->next!=NULL){
                fast = fast->next->next ;
                slow = slow->next ;
                if(fast==slow){
                    fast = pHead ;
                    while(fast!=slow){
                        fast = fast->next ;
                        slow = slow->next ;
                    }
                    return fast ;
                }
            }
            return NULL ;
        }
    };

    链表的总结:

    有翻转性质的可以用栈,删除要记录前一个Node

  • 相关阅读:
    MYSQL学习笔记——sql语句优化工具
    SQL优化工具SQLAdvisor使用
    SqlServer性能检测和优化工具使用详细
    Sql优化器究竟帮你做了哪些工作
    通俗易懂的php多线程解决方案
    PHP删除数组中空值的方法介绍
    PHP函数
    python函数回顾:dir()
    面向对象封装思想小结
    python函数回顾:all()
  • 原文地址:https://www.cnblogs.com/maskmtj/p/9266799.html
Copyright © 2020-2023  润新知