zoukankan      html  css  js  c++  java
  • 5-链表

    struct ListNode{
        int m_nValue;
        ListNode* m_pNext;  
    };
    
    # 往该链表的末尾添加一个节点
    往一个空链表中插入一个节点时,新插入的节点就是链表的头指针。由于此时会改动头指针,因此必须把pHead参数设为指向指针的指针,否则出了这个函数pHead仍然是一个空指针。
    void addToTail(ListNode** pHead, int value){
        ListNode* pNew = new ListNode();
        pNew->m_nValue = value;
        pNew->m_pNext = nullptr;
    
        if(*pHead == nullptr)
            *pHead = pNew;
        else{
            ListNode* pNode = *pHead;
            while(pNode->m_pNext != nullptr)
                pNode = pNode->m_pNext;
            pNode->m_pNext = pNew;
        }    
    }
    
    # 在链表中找到第一个含有某值的节点并删除该节点
    void RemoveNode(ListNode** pHead, int value){
        if(pHead==nullptr && *pHead==nullptr)
            return;
        ListNode* pToBeDeleted = nullptr;
        if((*pHead)->m_nValue == value){
            pToBeDeleted = *pHead;
            *pHead = (*pHead)->m_pNext;
        }else{
            ListNode* pNode = *pHead;
            while(pNode->m_pNext != nullptr && pNode->m_pNext->m_nValue!=value){
                pNode = pNode->m_pNext;
            }
            if(pNode->m_pNext!=nullptr && pNode->m_pNext->m_nValue==value){
                pToBeDeleted = pNode->m_pNext;
                pNode->m_pNext = pNode->m_pNext->m_pNext;
            }
        }
        if(pToBeDeleted != nullptr){
            delete pToBeDeleted;
            pToBeDeleted = nullptr;
        }
    }
    
    # 从尾到头打印链表
    是否能改变原来链表的结构? 取决于面试官,假如不能改变链表的结构
    1. "后进先出"  stack
    void PrintListReversingly_Iteratively(ListNode* pHead){
        stack<ListNode*> nodes;
        ListNode* pNode = pHead;
        while(pNode != nullptr){
            nodes.push(pNode);
            pNode = pNode->m_pNext;
        }
        while(!nodes.empty()){
            pNode = nodes.top()
            printf("%d	", pNode->m_nValue);
            nodes.pop();
        }
    }
    
    # 2. 递归在本质上就是一个stack结构,我们每访问一个节点的时候,先递归输出它后面的节点,再输出该节点自身
    void PrintListReversingly_Recursively(ListNode* pHead){
        if(pHead != nullptr){
            if(pHead->m_pNext != nullptr){
                PrintListReversingly_Recursively(pHead->m_pNext);
            }
            printf("%d	", pHead->m_nValue);
        }
    }
    上面的基于递归的代码看起来简洁,但有一个问题: 当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。
    
    
  • 相关阅读:
    cocos2dx 2.0 学习笔记简单动画
    几种插入数据的方法
    c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存
    C#高效编程改进C#代码的50个行之有效的办法摘抄笔记
    获取两个日期之间的每一天
    取SQL中某个字段的后两位
    该行已经属于另一个表 的解决办法
    一个实体对象不能由多个 IEntityChangeTracker 实例引用
    MVC返回JSON,IE下无法接收JSON,IE下JSON提示另存为
    entity framework DbContext Attach判断
  • 原文地址:https://www.cnblogs.com/CodingML-1122/p/9189919.html
Copyright © 2011-2022 走看看