5-链表

Posted codingml-1122

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    }
}
上面的基于递归的代码看起来简洁,但有一个问题: 当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。

以上是关于5-链表的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段5——HTML元素结构

VSCode自定义代码片段5——HTML元素结构

C语言反转单向链表的代码

JavaScript笔试题(js高级代码片段)

817. Linked List Components - LeetCode

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?