剑指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
原文地址:https://www.cnblogs.com/acm-jing/p/10407474.html