DAY6 - 链表(二)

今天继续写链表,整理几题比较需要思考的题目,直接进例题
链表的题目没什麽模板或是固定思路..所以就放几题经典的
/images/emoticon/emoticon14.gif/images/emoticon/emoticon03.gif

例题实战


138. 复制带随机指针的链表
往前复制一份再断开~~不算很直观

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(head==nullptr){
            return nullptr;
        }
        //每个Node复制一份
        Node* curr = head;
        while(curr){
            Node* copy = new Node(curr->val);
            Node* nnext = curr->next;
            curr->next = copy;
            copy->next = nnext;
            curr = curr->next->next;
        }
        curr = head;
        //链random指针
        while(curr){
            Node* copy = curr->next;
            if(copy&&curr->random)
                copy->random = curr->random->next;
            curr = curr->next->next;
        }
        //分离
        curr = head;
        Node* new_head = head->next;
        while(curr->next->next){
            Node* old = curr;
            Node* nnew = curr->next;
            old->next = old->next->next;
            nnew->next = nnew->next->next;
            curr = old->next;
        }
        curr->next->next = nullptr;
        curr->next = nullptr;
        return new_head;
    }
};

142. 环形链表 II
判断有环无环也算很经典的问题吧(?
但解决方法很简单,这类问题就用一个快指针(一次移动两步),一个慢指针(一次移动一步),看最後快指针能不能倒追到慢指针(就有环)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
    // ListNode* res;
    // unordered_map<ListNode*, bool> hash;
public:
    ListNode *detectCycle(ListNode *head) {
        // if(dfs(head)==false){
        //     return NULL;
        // }
        // return res;
        ListNode* slow = head;
        ListNode* fast = head;
        while(fast!=NULL && fast->next!=NULL){
            slow = slow->next;
            fast = fast->next->next;
            if(slow==fast){
                ListNode* p = head;
                while(p!=slow){
                    p = p->next;
                    slow = slow->next;
                }
                return p;
            }
        }
        return NULL;
    }
    // bool dfs(ListNode* head){
    //     if(head==NULL || head->next ==  NULL){
    //         return NULL;
    //     }
    //     if(hash[head]!=NULL){
    //         res = head;
    //         return true;
    //     }
    //     else{
    //         cout<< hash[head];
    //         hash[head] = true;
    //         return dfs(head->next);
    //     }
    //     return false;
    // }
};

19. 删除链表的倒数第 N 个结点
倒数N就先让一个指针先跑N步另一个从起点出发,等前面的指针走到终点,就是倒数N了

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        //双指针
        ListNode* temp = head;
        ListNode* f = head;
        ListNode* s = head;
        while(n--){
            f = f->next;
        }
        if(f==NULL){
            return head->next;
        }
        while(f->next!=NULL){
            f = f->next;
            s = s->next;
        }
        s->next = s->next->next;
        return temp;
    }
};

<<:  [Day3] Android - Kotlin笔记:高阶函式与 lambda

>>:  使用工具测试

DAY 19-数位签章- DSA

「快点签名啦。」 今天要来介绍数位签章。 首先澄清一点,数位签章是以数学运算的方式进行的签章,「签章...

偷懒无罪,让点子自动产生吧

在整理衣着出门的时候,脑袋瓜一直在转着不同的东西,包含等等要面对的电路,还有今天没有起来的检讨,但手...

【VidPaw 替代品】 Windows/Mac 轻松下载在线影片

VidPaw 是一个在线影片下载器,可以提供在线影片下载服务。 它支援广泛的网站,如 YouTube...

Day 10 : 案例分享(3.3) 会计模组-调节、立冲帐、应收付与收支款

案例说明及适用场景 当我们有某一个科目,需要管理他是否还有余额未被处理,这个科目就是所谓的 调节科目...

Day27 NiFi 场景应用范例 (二)

今天要带大家做另外一个简单的场境应用,我们继续沿用昨天所处理的 parquet File 来做今天的...