给定一个链表,怎么判断链表中存储的数据是回文
2013-01-16 17:23
363 查看
check whether a single linked list is palindrome. for example: 1->2->1,return ture. and 1->2->3->1 return false; and can you resolve it in linear time. 如果是数组那用递归和非递归都很好解决了,但是链表貌似有点麻烦。
首先给出思路就是:先找到链表中间的节点,记得区分链表中节点个数是奇数还是偶数。然后把链表的前一半节点放入栈之中,之后从中间节点的后一个节点开始,此节点和栈顶节点所存储的值进行比较,如果相等则继续进行后续比较,直到链表结尾。如果中间出现不相等的情况,则不是回文。 那么,怎么样找到链表的中间节点呢。一个方法是遍历一遍链表,统计它的节点个数,然后取个数的中间值(记得区奇数偶数)。这样再次遍历就会找到中间的节点。说道这里应该有思路了,但是还有一个更好的解法,就是设定双指针。
双指针的解法:
首先给出思路就是:先找到链表中间的节点,记得区分链表中节点个数是奇数还是偶数。然后把链表的前一半节点放入栈之中,之后从中间节点的后一个节点开始,此节点和栈顶节点所存储的值进行比较,如果相等则继续进行后续比较,直到链表结尾。如果中间出现不相等的情况,则不是回文。 那么,怎么样找到链表的中间节点呢。一个方法是遍历一遍链表,统计它的节点个数,然后取个数的中间值(记得区奇数偶数)。这样再次遍历就会找到中间的节点。说道这里应该有思路了,但是还有一个更好的解法,就是设定双指针。
#include<iostream> #include<stack> using namespace std; typedef struct node{ int data; struct node *next; }LinkNode, *LinkList; void create_list(LinkList *L, int *a, int n) { int i = 0; LinkNode *p = NULL; LinkNode *temp = NULL; while(i < n) { p = (LinkNode*)malloc(sizeof(LinkNode)); p->data = a[i]; p->next = NULL; if(*L == NULL) { *L = p; } else { temp->next = p; } temp = p; i++; } } int is_palindrome(LinkList head) { int length = 0; int mid = 0; int i; stack<LinkNode*> m_stack; LinkNode *p = head; LinkNode *temp = NULL; int flag = 1; while(p) { length++; p = p->next; } if(length %2 == 0) { mid = length / 2; } else { mid = length / 2 + 1; } p = head; i = 1; while(i <= mid - 1) { m_stack.push(p); p = p->next; i++; } if(length % 2 == 0) { m_stack.push(p); } p = p->next; while(!m_stack.empty() && p) { temp = m_stack.top(); m_stack.pop(); if(temp->data != p->data) { flag = 0; break; } p = p->next; } return flag; } void main() { int a[] = {1, 2, 3, 4, 5, 4, 3, 2, 1}; int n = sizeof(a) / sizeof(int); LinkList head = NULL; create_list(&head, a, n); if(is_palindrome(head)) { cout << "yes" << endl; } else { cout << "no" << endl; } getchar(); }
双指针的解法:
bool isPanli(LinkList head) { stack<LinkNode*> stk; LinkNode* slow = head; LinkNode* fast = head; bool flag = false; while (fast) { stk.push(slow); slow = slow->next; fast = fast->next; if (fast) { fast = fast->next; } else flag = true; } if (flag) stk.pop(); while (!stk.empty()) { if (stk.top()->data == slow->data){ stk.pop(); slow = slow->next; } else return false; } return true; }
相关文章推荐
- 给定一个链表,判断是否是回文
- 给定一个数字,怎么判断它是不是回文形式的?
- java判断一个链表是否是回文结构
- 链表之判断一个链表是否为回文结构(二)
- 给定一个一oracle建表的sql语句,解析读出的字符串,将表名、字段名、字段类型数据取出,怎么实现啊?
- 判断一个链表是否为回文结构
- 定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据?
- 判断一个链表是否为回文结构
- 判断一个单链表是否是回文链表
- 【华为面试题】给定一个数字(整数),判断它是否回文
- 判断一个链表是否为回文结构
- 判断一个链表是否是回文链表
- 原有一组数据区间段,给定一个区间,判断此区间是否和其他区间相交
- 怎么写好一个判断是否存在数据的代码?
- 判断一个数字是否为回文,不使用额外的存储空间
- 链表之判断一个链表是否为回文结构(三)
- 利用正则表达式判断一个给定的字符是否是回文
- 判断一个链表是否为回文结构
- 算法:实现链表存储的回文字符串判断
- 用单循环链表存储一个环上的数据,并计算任意两个相邻元素之差是否超过2