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

左神算法书籍《程序员代码面试指南》——2_06判断一个链表是否为回文结构

时间:2019-07-22 20:11:42      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:判断   入栈   style   using   namespace   include   for   复杂   使用   

【题目】
给定一个链表的头节点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<iostream>
  2 #include <vector>
  3 #include <stack>
  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<int>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<int>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<int>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<int>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 }

 

左神算法书籍《程序员代码面试指南》——2_06判断一个链表是否为回文结构

标签:判断   入栈   style   using   namespace   include   for   复杂   使用   

原文地址:https://www.cnblogs.com/zzw1024/p/11227956.html

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