【剑指Offer】中链表

来源:互联网 发布:阿里云客服好干吗 编辑:程序博客网 时间:2024/05/24 03:21
  • 链表的节点定义
struct ListNode{    int m_nValue;    ListNode* m_pNext;};
  • 给链表的末尾添加一个节点
void AddToTail(ListNode** pHead, int value){    ListNode* pNew = new ListNode();    pNew->m_nValue = value;    pNew->m_pNext = NULL;    if (*pHead == NULL){        *pHead = pNew;    }    else{        ListNode* pNode = *pHead;        while (pNode->m_pNext != NULL)            pNode = pNode->m_pNext;        pNode->m_pNext = pNew;    }}
  • 在链表中找到第一个含有某值的节点并且删除该节点
void RemoveNode(ListNode** pHead, int value){    if (pHead == NULL || *pHead == NULL)        return;    ListNode* pToBeDeleted = NULL;    if ((*pHead)->m_nValue == value)    {        pToBeDeleted = *pHead;        *pHead = (*pHead)->m_pNext;    }    else    {        ListNode* pNode = *pHead;        while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)            pNode = pNode->m_pNext;        if (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value)        {            pToBeDeleted = pNode->m_pNext;            pNode->m_pNext = pNode->m_pNext->m_pNext;        }    }    if (pToBeDeleted != NULL)    {        delete pToBeDeleted;        pToBeDeleted = NULL;    }}
  • 输入一个链表的头节点,从尾到头反过来打印出每个节点的值

1>用栈实现

void PrintListReversingly_Iteratively(ListNode* pHead){    stack<ListNode*>nodes;    ListNode* pNode = pHead;    while (pNode != NULL)    {        nodes.push(pNode);        pNode = pNode->m_pNext;    }    while (!nodes.empty())    {        pNode = nodes.top();        cout << pNode->m_nValue << ' ';        nodes.pop();    }}

2>用递归实现

void PrintListReversingly_Iteratively(ListNode* pHead){    if (pHead != NULL){        if (pHead->m_pNext != NULL){            PrintListReversingly_Iteratively(pHead->m_pNext);        }        cout << pHead->m_nValue << ' ';    }}
0 0