链表排序、链表删除、访问倒数第k个节点

心已赠人 2022-08-02 02:27 254阅读 0赞

1.设一个带头结点的单向链表的头指针为head,设计算法,将链表的记录,按照data域的值递增排序。

2.已知线性表中的元素以单链表作存储结构。试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间。

3.输出该链表中倒数第k个结点, tail为倒数第0个节点

  1. //
  2. #include "stdafx.h"
  3. #include<iostream>
  4. using namespace std;
  5. template<class T>
  6. struct Node{
  7. T value;
  8. Node*next;
  9. };
  10. template<class T>
  11. class list
  12. {
  13. private:
  14. Node<T>*head;
  15. Node<T>*tail;
  16. int len;//链表长度
  17. public:
  18. list();
  19. Node<T>*append(T ele);
  20. Node<T>*findKthfromhead(int k);
  21. Node<T>*findKthfromtail(int k);
  22. Node<T>*sort_list(int endpos);//链表排序
  23. Node<T>*delete_list(T x, T y);//删除表中所有大于x且小于y的元素(若表中存在这样的元素)
  24. Node<T>*reverse_list();//反转
  25. Node<T>*list<T>::delete_exist();//删除重复元素
  26. int length();
  27. };
  28. template<class T>
  29. Node<T>*list<T>::reverse_list()
  30. {
  31. <span style="white-space:pre"> </span>int k1 = length()-1;
  32. <span style="white-space:pre"> </span>int k2 = 0;
  33. <span style="white-space:pre"> </span>while (k1 - k2 > 0)
  34. <span style="white-space:pre"> </span>{
  35. <span style="white-space:pre"> </span>int mm;
  36. <span style="white-space:pre"> </span>mm = findKthfromhead(k1)->value;
  37. <span style="white-space:pre"> </span>findKthfromhead(k1)->value = findKthfromhead(k2)->value;
  38. <span style="white-space:pre"> </span>findKthfromhead(k2)->value = mm;
  39. <span style="white-space:pre"> </span>--k1;
  40. <span style="white-space:pre"> </span>++k2;
  41. <span style="white-space:pre"> </span>}
  42. <span style="white-space:pre"> </span>return head;
  43. }
  44. template<class T>
  45. Node<T>*list<T>::delete_list(T x, T y)
  46. {
  47. _ASSERT(y > x);
  48. _ASSERT(len > 0);
  49. sort_list(len - 1);
  50. if (head->value >= y || tail->value <= x)
  51. return head;
  52. if (head->value > x)
  53. {
  54. Node<T>*m = new Node < T >;
  55. while (head->value < y)
  56. {
  57. Node<T>*node = new Node < T > ;
  58. node = head;
  59. if (head->next == NULL)
  60. {
  61. head = NULL;
  62. len = 0;
  63. return head;
  64. }
  65. head->value = head->next->value;
  66. head = head->next;
  67. --len;
  68. delete node;
  69. }
  70. return head;
  71. }
  72. Node<T>*node = new Node < T >;
  73. Node<T>*m = new Node < T >;
  74. node = head;
  75. while (node->value <= x)
  76. {
  77. m = node;
  78. m->value = node->value;
  79. node = node->next;
  80. }
  81. while (node->value < y)
  82. {
  83. Node<T>*n = new Node < T > ;
  84. n = node;
  85. if (node->next == NULL)
  86. {
  87. m->next = NULL;
  88. tail = m;
  89. --len;
  90. return head;
  91. }
  92. node->value = node->next->value;
  93. node = node->next;
  94. --len;
  95. delete n;
  96. }
  97. m->next = node;
  98. return head;
  99. }
  100. template<class T>
  101. Node<T>*list<T>::sort_list(int endpos)//递归实现排序
  102. {
  103. int k = 0;
  104. int pp;
  105. if (endpos == 0)
  106. return head;
  107. Node<T>*node = new Node < T >;
  108. node = head;
  109. while (k < endpos)
  110. {
  111. if (node->value > node->next->value)
  112. {
  113. pp = node->value;
  114. node->value = node->next->value;
  115. node->next->value = pp;
  116. }
  117. ++k;
  118. node = node->next;
  119. }
  120. --endpos;
  121. sort_list(endpos);
  122. //delete node;
  123. }
  124. template<class T>
  125. Node<T>*list<T>::findKthfromhead(int k)
  126. {
  127. //if (len == 0)
  128. // return NULL;
  129. _ASSERT(k < len);
  130. Node<T>*KthNode = new Node < T > ;
  131. KthNode = head;
  132. while (k)
  133. {
  134. KthNode = KthNode->next;
  135. --k;
  136. }
  137. return KthNode;
  138. }
  139. template<class T>
  140. Node<T>*list<T>::findKthfromtail(int k)
  141. {
  142. _ASSERT(k < len);
  143. return findKthfromhead(len-1-k);
  144. }
  145. template<class T>
  146. int list<T>::length()
  147. {
  148. return len;
  149. }
  150. template<class T>
  151. Node<T>*list<T>::append(T ele)
  152. {
  153. if (head == NULL)
  154. {
  155. head = new Node < T > ;
  156. tail = new Node < T >;
  157. head->value = ele;
  158. head->next = NULL;
  159. tail->value = ele;
  160. tail->next = NULL;
  161. len = 1;
  162. return head;
  163. }
  164. if (head->next == NULL)
  165. {
  166. head->next = tail;
  167. tail->value = ele;
  168. tail->next = NULL;
  169. len = 2;
  170. return head;
  171. }
  172. else
  173. {
  174. Node<T>*node = new Node < T > ;
  175. node->next = NULL;
  176. node->value = ele;
  177. tail->next = node;
  178. tail = node;
  179. ++len;
  180. return head;
  181. }
  182. }
  183. template<class T>
  184. list<T>::list()
  185. {
  186. head = NULL;
  187. tail = NULL;
  188. len = 0;
  189. }
  190. template<class T>
  191. Node<T>*list<T>::delete_exist()
  192. {
  193. <span style="white-space:pre"> </span>sort_list(len - 1);
  194. <span style="white-space:pre"> </span>
  195. <span style="white-space:pre"> </span>Node<T>* node,*n,*m;
  196. <span style="white-space:pre"> </span>n=node = head;
  197. <span style="white-space:pre"> </span>
  198. <span style="white-space:pre"> </span>while (node->next != NULL)
  199. <span style="white-space:pre"> </span>{
  200. <span style="white-space:pre"> </span>
  201. <span style="white-space:pre"> </span>if (node->value == node->next->value)
  202. <span style="white-space:pre"> </span>{
  203. <span style="white-space:pre"> </span>while (node->next != NULL&&node->value == node->next->value)
  204. <span style="white-space:pre"> </span>{
  205. <span style="white-space:pre"> </span>m = node;
  206. <span style="white-space:pre"> </span>node = node->next;
  207. <span style="white-space:pre"> </span>delete m;
  208. <span style="white-space:pre"> </span>--len;
  209. <span style="white-space:pre"> </span>}
  210. <span style="white-space:pre"> </span>n->next = node;
  211. <span style="white-space:pre"> </span>node = node->next;
  212. <span style="white-space:pre"> </span>
  213. <span style="white-space:pre"> </span>}
  214. <span style="white-space:pre"> </span>else
  215. <span style="white-space:pre"> </span>{
  216. <span style="white-space:pre"> </span>n = node;
  217. <span style="white-space:pre"> </span>node = node->next;
  218. <span style="white-space:pre"> </span>}
  219. <span style="white-space:pre"> </span>}
  220. <span style="white-space:pre"> </span>/*
  221. <span style="white-space:pre"> </span>while (node->next != NULL)
  222. <span style="white-space:pre"> </span>{
  223. <span style="white-space:pre"> </span>m = n->next;
  224. <span style="white-space:pre"> </span>m->value = n->next->value;
  225. <span style="white-space:pre"> </span>while (n->value == n->next->value)
  226. <span style="white-space:pre"> </span>{
  227. <span style="white-space:pre"> </span>m = n;
  228. <span style="white-space:pre"> </span>m->value = n->value;
  229. <span style="white-space:pre"> </span>n->value = n->next->value;
  230. <span style="white-space:pre"> </span>n = n->next;
  231. <span style="white-space:pre"> </span>if (n->next == NULL)
  232. <span style="white-space:pre"> </span>{
  233. <span style="white-space:pre"> </span>//delete m;
  234. <span style="white-space:pre"> </span>--len;
  235. <span style="white-space:pre"> </span>return head;
  236. <span style="white-space:pre"> </span>}
  237. <span style="white-space:pre"> </span>//delete m;
  238. <span style="white-space:pre"> </span>--len;
  239. <span style="white-space:pre"> </span>}
  240. <span style="white-space:pre"> </span>node->next = m;
  241. <span style="white-space:pre"> </span>node->next->value = m->value;
  242. <span style="white-space:pre"> </span>n = n->next;
  243. <span style="white-space:pre"> </span>n->value = n->next->value;
  244. <span style="white-space:pre"> </span>}
  245. <span style="white-space:pre"> </span>*/
  246. <span style="white-space:pre"> </span>return head;
  247. }
  248. int _tmain(int argc, _TCHAR* argv[])
  249. {
  250. list<int>aa;
  251. aa.append(6);
  252. cout <<"长度为"<< aa.length() << endl;
  253. aa.append(5);
  254. cout << "长度为" << aa.length() << endl;
  255. aa.append(4);
  256. cout << "长度为" << aa.length() << endl;
  257. aa.append(3);
  258. cout << "长度为" << aa.length() << endl;
  259. aa.append(2);
  260. cout << "长度为" << aa.length() << endl;
  261. cout <<"第三个数为"<< aa.findKthfromhead(3)->value << endl;
  262. cout << "倒数第三个数为" << aa.findKthfromtail(3)->value << endl;
  263. aa.sort_list(aa.length() - 1);
  264. //aa.delete_list(1, 7);
  265. aa.delete_list(1, 4);
  266. cout << "长度为" << aa.length() << endl;
  267. for (int i = 0; i < aa.length(); i++)
  268. cout << aa.findKthfromhead(i)->value << endl;
  269. system("pause");
  270. return 0;
  271. }

发表评论

表情:
评论列表 (有 0 条评论,254人围观)

还没有评论,来说两句吧...

相关阅读

    相关 倒数K节点

    输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2

    相关 倒数k节点

    链表中倒数第k个节点 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节