博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反转单链表和双链表
阅读量:6114 次
发布时间:2019-06-21

本文共 3436 字,大约阅读时间需要 11 分钟。

Problem:

  反转单向和双向链表
  【题目】 分别实现反转单向链表和反转双向链表的函数。
  【要求】 如果链表长度为N,时间复杂度要求为O(N),额外空间
  复杂度要求为O(1)

Solution:

  学会使用指针

Code:

  

1 #pragma once  2   3 #include 
4 5 using namespace std; 6 7 struct Node 8 { 9 int val; 10 Node* next; 11 Node(int a = 0) :val(a), next(NULL) {} 12 }; 13 14 void ReverSingleList(Node*& head)//反转单向链表 15 { 16 if (head->next == NULL || head->next->next == NULL) 17 return; 18 Node *p1, *p2, *p3; 19 p1 = head->next; 20 p2 = p1->next; 21 p3 = p2->next; 22 p1->next = NULL; 23 while (p3) 24 { 25 p2->next = p1; 26 p1 = p2; 27 p2 = p3; 28 p3 = p3->next; 29 } 30 p2->next = p1; 31 head->next = p2; 32 } 33 34 35 struct DNode 36 { 37 int val; 38 DNode* next; 39 DNode* pre; 40 DNode(int a = 0) :val(a), next(NULL),pre(NULL) {} 41 }; 42 43 void ReverDoubleList(DNode*& head)//反转双向链表,方法与单向链表一样 44 { 45 if (head->next == NULL || head->next->next == NULL) 46 return; 47 DNode *p1, *p2, *p3; 48 p1 = head->next; 49 p2 = p1->next; 50 p3 = p2->next; 51 p1->next = NULL; 52 p1->pre = p2; 53 while (p3) 54 { 55 p2->next = p1; 56 p1->pre = p2; 57 p2->pre = p3; 58 p1 = p2; 59 p2 = p3; 60 p3 = p3->next; 61 } 62 p2->next = p1; 63 p2->pre = head; 64 head->next = p2; 65 } 66 67 void Test() 68 { 69 int a[6] = { 1,2,3,4,5,6 }; 70 Node* head = new Node(-1); 71 Node* p = head; 72 for (auto n : a) 73 { 74 Node* q = new Node(n); 75 p->next = q; 76 p = q; 77 } 78 p->next = NULL; 79 80 p = head->next; 81 cout << "原链表为: "; 82 while (p) 83 { 84 cout << p->val << "->"; 85 p = p->next; 86 } 87 88 ReverSingleList(head); 89 p = head->next; 90 cout << endl << "*******************" << endl << "反转后的链表为: "; 91 while (p) 92 { 93 cout << p->val << "->"; 94 p = p->next; 95 } 96 cout << endl << "=============================" << endl; 97 cout << "=============================" << endl; 98 cout << "=============================" << endl; 99 100 101 int b[6] = { 1,2,3,4,5,6 };102 DNode* head2 = new DNode(-1);103 DNode* p2 = head2;104 for (auto n : b)105 {106 DNode* q2 = new DNode(n);107 p2->next = q2;108 q2->pre = p2;109 p2 = q2;110 }111 p2->next = NULL;112 113 p2 = head2->next;114 cout << "原链表为的顺为: ";115 while (p2->next)116 {117 cout << p2->val << "->";118 p2 = p2->next;119 }120 cout << p2->val << "->";121 cout << endl << "*******************" << endl << "原链表为的逆为: ";122 while (p2->pre)123 {124 cout << p2->val << "->";125 p2 = p2->pre;126 }127 128 ReverDoubleList(head2);129 p2 = head2->next;130 cout << endl << "*******************" << endl << "反转后的双向链表的顺为: ";131 while (p2->next)132 {133 cout << p2->val << "->";134 p2 = p2->next;135 }136 cout << p2->val << "->";137 cout << endl << "*******************" << endl << "反转后的双向链表的逆为: ";138 while (p2->pre)139 {140 cout << p2->val << "->";141 p2 = p2->pre;142 }143 cout << endl << "=============================" << endl;144 }

 

转载于:https://www.cnblogs.com/zzw1024/p/10989154.html

你可能感兴趣的文章
VB 6.0中判断是否Access 2010中存在指定表格
查看>>
流水线上的思考——异步程序开发模型(1)
查看>>
为SharePoint网站创建自定义导航菜单
查看>>
分布式系统的Raft算法——在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新 意味着还是可能丢数据!!!...
查看>>
检查点(Checkpoint)过程如何处理未提交的事务
查看>>
iphone开发中的手势操作:Multiple Taps
查看>>
牛刀小试Oracle之FRA学习
查看>>
Azure SQL Database (21) 将整张表都迁移到Azure Stretch Database里
查看>>
jquery autocomplete实现读取sql数据库自动补全TextBox
查看>>
前端构建工具gulp入门教程(share)
查看>>
springmvc原理
查看>>
详细说说ActionScript中function的call()方法和apply()方法
查看>>
Oracle Database Administrator验证模式
查看>>
懒人代码-顶部栏
查看>>
elasticsearch best_fields most_fields cross_fields从内在实现看区别——本质就是前两者是以field为中心,后者是词条为中心...
查看>>
Ngxtop-Nginx日志实时分析利器
查看>>
android:设置布局参数LayoutParams
查看>>
用Swift实现一款天气预报APP(一)
查看>>
ARM中断向量表与响应流程【转】
查看>>
[Java基础] java多线程关于消费者和生产者
查看>>