码迷,mamicode.com
首页 > 编程语言 > 详细

关于链表所有操作,面试必考C++

时间:2017-08-17 18:34:28      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:tail   else   log   blog   names   clu   main   cout   class   

  1 #include <iostream>
  2 #include <stack>
  3 using namespace std;
  4 //链表的结构体
  5 struct ListNode
  6 {
  7     int m_nValue;
  8     ListNode* m_pNext;
  9     ListNode()
 10     {
 11         m_pNext = NULL;
 12     }
 13 };
 14 //判断链表是否为空
 15 bool isEmpty(ListNode* list)
 16 {
 17     return list->m_pNext == NULL;
 18 }
 19 //判断position是否是最后一个
 20 bool isLast(ListNode* position, ListNode* list)
 21 {
 22     return position->m_pNext == NULL;
 23 }
 24 //在链表中找到某个元素
 25 ListNode* Find(int value, ListNode* list)
 26 {
 27     ListNode* pNode = list->m_pNext;//指向第一个结点,list为头结点,不存放数据
 28     while (pNode != NULL && pNode->m_nValue != value)
 29     {
 30         pNode = pNode->m_pNext;
 31     }
 32     return pNode;
 33 }
 34 //找到某一元素的前驱结点
 35 ListNode* FindPrevious(int value, ListNode* list)
 36 {
 37     //指向第一个结点
 38     ListNode* pNode = list;
 39     while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
 40     {
 41         pNode = pNode->m_pNext;
 42     }
 43     return pNode;
 44 }
 45 //删除某个结点
 46 void DeleteNode(int value, ListNode* list)
 47 {
 48     if (list == NULL)
 49     {
 50         return;
 51     }
 52     //要将删除的结点进行备份
 53     ListNode* pDeleteNode = NULL;
 54     ListNode* pNode = list;
 55     while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
 56     {
 57         pNode = pNode->m_pNext;
 58     }
 59     if (pNode->m_pNext != NULL)
 60     {
 61         pDeleteNode = pNode->m_pNext;//待删除的结点
 62         pNode->m_pNext = pDeleteNode->m_pNext;//待删除结点的下一个结点
 63         //释放待删除的结点
 64         delete pDeleteNode;
 65         pDeleteNode = NULL;
 66     }
 67     return;
 68 }
 69 //将一个元素插入到pToBeInsertNode指示的结点之后,元素的值为value;
 70 void InsertNode(int value, ListNode* list, ListNode* pToBeInsertNode)
 71 {
 72     if (list == NULL || pToBeInsertNode == NULL)
 73     {
 74         return;
 75     }
 76     ListNode* pNewNode = new ListNode();
 77     if (pNewNode == NULL)
 78     {
 79         return;
 80     }
 81     pNewNode->m_nValue = value;
 82     pNewNode->m_pNext = pToBeInsertNode->m_pNext;
 83     pToBeInsertNode->m_pNext = pNewNode;
 84 }
 85 
 86 //在末尾添加元素
 87 void AddToTail( ListNode* list, int value)
 88 {
 89     //建立一个新节点
 90     ListNode* pNewNode = new ListNode();
 91     if (pNewNode == NULL)
 92     {
 93         return;
 94     }
 95     pNewNode->m_nValue = value;
 96     pNewNode->m_pNext = NULL;
 97     if (list == NULL)
 98     {
 99         list = pNewNode;
100     }
101     else
102     {
103         ListNode* tmpNode = list;
104         while (tmpNode->m_pNext != NULL)
105         {
106             tmpNode = tmpNode->m_pNext;
107         }
108         tmpNode->m_pNext = pNewNode;//最后一个的下一个结点指向新节点
109     }
110 }
111 //删除整个链表  
112 void DeleteList(ListNode*list) {
113     if (list == NULL)
114     {
115         return;
116     }
117     ListNode*pNode = list->m_pNext;
118     ListNode*pTemp = NULL;
119 
120     list->m_pNext = NULL; //断开头结点  
121     while (pNode != NULL)
122     {
123         pTemp = pNode->m_pNext;//需要保存其下一个节点  
124         delete pNode;
125         pNode = pTemp;        //移到下一个节点  
126     }
127 }
128 
129 //打印链表
130 void printList(ListNode* list)
131 {
132     if (list == NULL)
133     {
134         return;
135     }
136     ListNode* pNode = list->m_pNext;
137     while (pNode != NULL)
138     {
139         cout << pNode->m_nValue << " ";
140         pNode = pNode->m_pNext;
141     }
142     cout << endl;
143 }
144 //逆序打印链表
145 void printListReversingly(ListNode* list)
146 {
147     stack<ListNode*> nodes;
148     ListNode* pNode = list->m_pNext;
149     while (pNode != NULL)
150     {
151         nodes.push(pNode);//压栈
152         pNode = pNode->m_pNext;
153     }
154     while (!nodes.empty())
155     {
156         ListNode* pTmp = nodes.top();//获取顶端元素
157         cout << pTmp->m_nValue << " ";
158         nodes.pop();//弹出
159     }
160     cout << endl;
161 }
162 //判断一个链表是否有环
163 bool LinkListLoop(ListNode* pHead)
164 {
165     ListNode* p = pHead;
166     ListNode* q = pHead;
167     while (p != NULL && q != NULL)
168     {
169         p = p->m_pNext;//p走一步;
170         q = q->m_pNext;
171         if (q->m_pNext != NULL)
172             q = q->m_pNext;//q走两步;
173         if (p != NULL && p == q)
174         {
175             return true;
176         }
177     }
178     return false;
179 }
180 //测试  
181 int main() {
182     ListNode* list = new ListNode();
183     for (int i = 0; i < 10; i++)
184     {
185         AddToTail(list, i);
186     }
187     cout << "打印链表:" << endl;
188     printList(list);
189 
190     cout << "逆序打印链表:" << endl;
191     printListReversingly(list);
192 
193     cout << "在末尾添加元素:10" << endl;
194     AddToTail(list, 10);
195     printList(list);
196 
197     cout << "移除节点值为5的节点:" << endl;
198     DeleteNode(5, list);
199     printList(list);
200 
201     cout << "找到节点值为6的节点的前驱节点:" << endl;
202     ListNode* pNode = FindPrevious(6, list);
203     cout << pNode->m_nValue << endl;
204 
205     cout << "删除链表:" << endl;
206     DeleteList(list);
207     printList(list);
208 
209     cout << "链表是否为空:" << endl;
210     cout << isEmpty(list) << endl;
211     system("pause");
212     return 0;
213 }

 

关于链表所有操作,面试必考C++

标签:tail   else   log   blog   names   clu   main   cout   class   

原文地址:http://www.cnblogs.com/maleyang/p/7383193.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!