zoukankan      html  css  js  c++  java
  • 剑指offer——链表

      1 #include"stdio.h"
      2 #include"stdlib.h"
      3 #include"iostream"
      4 using namespace std;
      5 
      6 struct ListNode
      7 {
      8     int m_Value;
      9     ListNode* m_pNext;
     10 };
     11 
     12 ListNode* CreateListNode(int value)
     13 {
     14     ListNode* pNode=new ListNode();
     15     pNode->m_Value=value;
     16     pNode->m_pNext=nullptr;
     17 
     18     return pNode;
     19 }
     20 
     21 void ConnectListNodes(ListNode* pCurrent,ListNode* pNext)
     22 {
     23     if(pCurrent==nullptr)
     24     {
     25         cout<<"Error to connect two nodes."<<endl;
     26         exit(1);
     27     }
     28     pCurrent->m_pNext=pNext;
     29 }
     30 
     31 void PrintListNode(ListNode* pNode)
     32 {
     33     if(pNode==nullptr)
     34     {
     35         cout<<"The node is nullptr."<<endl;
     36     }
     37     else
     38     {
     39         cout<<"the value in node is: "<<pNode->m_Value<<endl;
     40     }
     41 }
     42 
     43 void PrintList(ListNode *pHead)
     44 {
     45     cout<<"PrintList starts."<<endl;
     46 
     47     ListNode* pNode=pHead;
     48     while(pNode!=nullptr)
     49     {
     50         cout<<pNode->m_Value<<" ";
     51         pNode=pNode->m_pNext;
     52     }
     53     cout<<endl<<"PrintList ends."<<endl;
     54 }
     55 
     56 void DestroyList(ListNode* pHead)
     57 {
     58     ListNode* pNode=pHead;
     59     while(pNode!=nullptr)
     60     {
     61         pHead=pHead->m_pNext;
     62         delete pNode;
     63         pNode=pHead;
     64     }
     65 }
     66 
     67 void AddToTail(ListNode** pHead,int value)
     68 {
     69     ListNode* pNode=CreateListNode(value);
     70     if(pHead==nullptr || *pHead==nullptr)
     71     {
     72         *pHead=pNode;
     73     }
     74     else
     75     {
     76         ListNode* pTemp=*pHead;
     77         while(pTemp->m_pNext!=nullptr)
     78             pTemp=pTemp->m_pNext;
     79         pTemp->m_pNext=pNode;
     80     }
     81 }
     82 
     83 void RemoveNode(ListNode** pHead,int value)
     84 {
     85     if(pHead == nullptr || *pHead == nullptr)
     86         return;
     87 
     88     ListNode* pToBeDeleted = nullptr;
     89     if((*pHead)->m_Value == value)
     90     {
     91         pToBeDeleted = *pHead;
     92         *pHead = (*pHead)->m_pNext;
     93     }
     94     else
     95     {
     96         ListNode* pNode = *pHead;
     97         while(pNode->m_pNext != nullptr && pNode->m_pNext->m_Value != value)
     98             pNode = pNode->m_pNext;
     99 
    100         if(pNode->m_pNext != nullptr && pNode->m_pNext->m_Value == value)
    101         {
    102             pToBeDeleted = pNode->m_pNext;
    103             pNode->m_pNext = pNode->m_pNext->m_pNext;
    104         }
    105     }
    106 
    107     if(pToBeDeleted != nullptr)
    108     {
    109         delete pToBeDeleted;
    110         pToBeDeleted = nullptr;//防止指正悬挂
    111     }
    112 }
    113 //O(1)复杂度
    114 void DeleteNode(ListNode** pHead,ListNode* pToBeDeleted)
    115 {
    116     if(*pHead==nullptr || pToBeDeleted==nullptr)
    117         return;
    118     if(pToBeDeleted->m_pNext!=nullptr)
    119     {
    120         ListNode* pNext=pToBeDeleted->m_pNext;
    121         pToBeDeleted->m_pNext=pNext->m_pNext;
    122         pToBeDeleted->m_Value=pNext->m_Value;
    123         delete pNext;
    124         pNext=nullptr;
    125     }
    126     else if(pToBeDeleted==*pHead)
    127     {
    128         delete pToBeDeleted;
    129         pToBeDeleted=nullptr;
    130         *pHead=nullptr;
    131     }
    132     else
    133     {
    134         ListNode* pNode=*pHead;
    135         while(pNode->m_pNext!=pToBeDeleted)
    136             pNode=pNode->m_pNext;
    137         pNode->m_pNext=nullptr;
    138         delete pToBeDeleted;
    139         pToBeDeleted=nullptr;
    140     }
    141 }
    142 
    143 ListNode* TheLastKthNode(ListNode* pHead,int k)
    144 {
    145     if(pHead==nullptr || k<=0)
    146         return nullptr;
    147     ListNode* quickNode=pHead;
    148     ListNode* slowNode=pHead;
    149     int cnt=1;
    150     while(quickNode->m_pNext!=nullptr&&cnt<k)
    151     {
    152         quickNode=quickNode->m_pNext;
    153         ++cnt;
    154     }
    155     if(cnt<k)
    156         return nullptr;
    157     while(quickNode->m_pNext!=nullptr)
    158     {
    159         quickNode=quickNode->m_pNext;
    160         slowNode=slowNode->m_pNext;
    161     }
    162     return slowNode;
    163 }
    164 
    165 ListNode* MeetingNode(ListNode* pHead)
    166 {
    167     if(pHead==nullptr)
    168         return nullptr;
    169     ListNode* quickNode=pHead;
    170     ListNode* slowNode=pHead;
    171 
    172     while(quickNode->m_pNext!=nullptr&&quickNode->m_pNext->m_pNext!=nullptr)
    173     {
    174         quickNode=quickNode->m_pNext->m_pNext;
    175         slowNode=slowNode->m_pNext;
    176         if(quickNode==slowNode)
    177             break;
    178     }
    179     if(quickNode!=slowNode)
    180     {
    181         return nullptr;
    182     }
    183     return slowNode;
    184 }
    185 
    186 ListNode* EntryNodeOfLoop(ListNode* pHead)
    187 {
    188     ListNode* meetingNode=MeetingNode(pHead);
    189     if(meetingNode==nullptr)
    190         return nullptr;
    191     int nodesInLoop=1;
    192     ListNode* pTemp=meetingNode;
    193     while(pTemp->m_pNext!=meetingNode)
    194     {
    195         pTemp=pTemp->m_pNext;
    196         nodesInLoop++;
    197     }
    198     ListNode* quickNode=pHead;
    199     ListNode* slowNode=pHead;
    200     for(int i=0;i<nodesInLoop;i++)
    201         quickNode=quickNode->m_pNext;
    202     while(slowNode!=quickNode)
    203     {
    204         quickNode=quickNode->m_pNext;
    205         slowNode=slowNode->m_pNext;
    206     }
    207     return slowNode;
    208 }
    View Code
  • 相关阅读:
    【Spring】构建Spring Web应用
    【记录】Spring项目转化为Spring Web项目
    【生活工具】你能带我回家么,可能明天要下雨了。
    【Spring】面向切面之AOP
    【Spring】高级装配
    【Linux】Linux学习笔记(完结)
    【Spring】Spring的bean装配
    【Netty】源码分析目录
    【项目实战】多线程环境下正确创建单例
    【环境搭建】使用Jekyll搭建Github博客
  • 原文地址:https://www.cnblogs.com/acm-jing/p/10407474.html
Copyright © 2011-2022 走看看