zoukankan      html  css  js  c++  java
  • 链表复制

    48. 复杂链表的复刻

    请实现一个函数可以复制一个复杂链表。

    在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。

    注意:

    • 函数结束后原链表要与输入时保持一致。
    /**
     * Definition for singly-linked list with a random pointer.
     * struct ListNode {
     *     int val;
     *     ListNode *next, *random;
     *     ListNode(int x) : val(x), next(NULL), random(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *copyRandomList(ListNode *head) {
            auto p = head;
            //第一次遍历,每个节点后面复制一个节点
            while(p){
                auto t = new ListNode(p->val);
                t->next = p->next;
                p->next = t;
                p = t->next;
            }
            p = head;
            //第二次遍历,为复制的节点接上random指针
            while(p){
                if(p->random){
                    //下面这句要理解
                    p->next->random = p->random->next;
                }
                p = p->next->next;
            }
            auto newh = new ListNode(-1);
            auto cur = newh;
            p = head;
            //第三次遍历,将复制的节点与原节点分离;
            while(p){
                cur->next = p->next;
                cur = cur->next;
                p->next = p->next->next;
                p = p->next;
            }
            return newh->next;
        }
    };
  • 相关阅读:
    使用eclipse新建一个SWT工程
    C++类的构造函数
    D3D编程的常见报错及解决
    D3D窗口的初始化
    C++联合体的内存使用
    QT程序如何编译
    Restart
    HTML
    信号、槽位及布局
    QT对话框程序
  • 原文地址:https://www.cnblogs.com/Aliencxl/p/12341446.html
Copyright © 2011-2022 走看看