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

posted @ 2018-07-05 10:04  mask_天俊  阅读(672)  评论(0编辑  收藏  举报