博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左神算法书籍《程序员代码面试指南》——2_06判断一个链表是否为回文结构
阅读量:4541 次
发布时间:2019-06-08

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

【题目】

给定一个链表的头节点head,请判断该链表是否为回文结构。
例如:
1->2->1,返回true。
1->2->2->1,返回true。
15->6->15,返回true。
1->2->3,返回false。
进阶:
如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。
【题解】
方法一:
遍历一遍链表,将数据压入栈中
然后再遍历一遍链表与栈的弹出数据对比
方法二:
使用快慢指针,将链表的前部分压入栈,然后栈数据弹出与链表的后半部分对比
方法三:
使用快慢指针,将链表的后半部分反转,然后与链表前半部分对比

 

1 #include
2 #include
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(nullptr) {} 12 }; 13 14 bool Way1(Node* head) 15 { 16 stack
s; 17 Node* p = head->next; 18 while (p) 19 { 20 s.push(p->val); 21 p = p->next; 22 } 23 p = head->next; 24 while (!s.empty()) 25 { 26 if (p->val != s.top()) 27 return false; 28 p = p->next; 29 s.pop(); 30 } 31 return true; 32 } 33 bool Way2(Node* head) 34 { 35 Node *p, *q; 36 stack
s; 37 p = q = head->next; 38 while (q && q->next) 39 { 40 p = p->next; 41 q = q->next->next; 42 } 43 if (q) 44 p = p->next; 45 while (p) 46 { 47 s.push(p->val); 48 p = p->next; 49 } 50 p = head->next; 51 while (!s.empty()) 52 { 53 if (p->val != s.top()) 54 return false; 55 p = p->next; 56 s.pop(); 57 } 58 return true; 59 } 60 bool Way3(Node* head) 61 { 62 Node *p, *q, *pre=nullptr; 63 stack
s; 64 p = q = head->next; 65 while (q && q->next) 66 { 67 pre = p; 68 p = p->next; 69 q = q->next->next; 70 } 71 if (q) 72 { 73 pre = p; 74 p = p->next; 75 } 76 pre->next = nullptr; 77 while (p) 78 { 79 q = p->next; 80 p->next = pre->next; 81 pre->next = p; 82 p = q; 83 } 84 p = head->next; 85 while (pre->next) 86 { 87 if (p->val != pre->next->val) 88 return false; 89 p = p->next; 90 pre = pre->next; 91 } 92 return true; 93 } 94 95 int main() 96 { 97 Node* head = new Node(-1); 98 Node* p = head; 99 vector
v;100 v = { 1,2,2,1 };101 for (auto a : v)102 {103 Node* q = new Node(a);104 p->next = q;105 p = q;106 }107 cout << Way1(head) << endl;108 cout << Way2(head) << endl;109 cout << Way3(head) << endl;110 111 return 0;112 }

 

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

你可能感兴趣的文章
android 按menu键解锁功能的开关
查看>>
Linux 下的dd命令使用详解
查看>>
POJ-1273 Drainage Ditches 最大流Dinic
查看>>
ASP.NET学习记录点滴
查看>>
[Noip2016] 愤怒的小鸟
查看>>
JAVA wait()和notifyAll()实现线程间通讯
查看>>
python全栈脱产第11天------装饰器
查看>>
[总结]数据结构(板子)
查看>>
C# 笔记
查看>>
[转]人人店短信插件开发
查看>>
[转]c# System.IO.Ports SerialPort Class
查看>>
14. 最长公共前缀
查看>>
Redis文档
查看>>
项目重构
查看>>
(笔试题)和一半的组合数
查看>>
leetcode--Algorithm--Array_Part 1 Easy- 566 Reshape the Matrix
查看>>
AC自动机算法详解 (转载)
查看>>
python3-day5(模块)
查看>>
Linux配置JDK
查看>>
qt 读取xml文件
查看>>