[LeetCode234]Palindrome Linked List
2016-03-04 22:09
405 查看
题目:
Given a singly linked list, determine if it is a palindrome.
判断一个单链表是不是回文
思路:
1、遍历整个链表,将链表每个节点的值记录在数组中,再判断数组是不是一个回文数组,时间复杂度为O(n),但空间复杂度也为O(n),不满足空间复杂度要求。
2、利用栈先进后出的性质,将链表前半段压入栈中,再逐个弹出与链表后半段比较。时间复杂度O(n),但仍然需要n/2的栈空间,空间复杂度为O(n)。
3、反转链表法,将链表后半段原地翻转,再将前半段、后半段依次比较,判断是否相等,时间复杂度O(n),空间复杂度为O(1)满足题目要求。
代码:这里采用第三种
Given a singly linked list, determine if it is a palindrome.
判断一个单链表是不是回文
思路:
1、遍历整个链表,将链表每个节点的值记录在数组中,再判断数组是不是一个回文数组,时间复杂度为O(n),但空间复杂度也为O(n),不满足空间复杂度要求。
2、利用栈先进后出的性质,将链表前半段压入栈中,再逐个弹出与链表后半段比较。时间复杂度O(n),但仍然需要n/2的栈空间,空间复杂度为O(n)。
3、反转链表法,将链表后半段原地翻转,再将前半段、后半段依次比较,判断是否相等,时间复杂度O(n),空间复杂度为O(1)满足题目要求。
代码:这里采用第三种
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *cur = head; ListNode *tmp, *prev = NULL; while(cur) { tmp = cur->next; cur->next = prev; prev = cur; cur = tmp; } return prev; } bool isPalindrome(ListNode* head) { if(!head || !head->next) return true; //快慢指针法 寻找中点 ListNode *slow, *fast; slow = fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next->next; } if(fast)//链表元素奇数个 { slow->next = reverseList(slow->next); slow = slow->next; } else//链表偶数个 { slow = reverseList(slow); } while(slow) { if(head->val != slow->val) { return false; } slow = slow->next; head = head->next; } return true; } };
相关文章推荐
- BZOJ 1022 小约翰的游戏
- js 原生对象排序
- C#旅途 ----趁热打铁 活学活用 数组快排,查找,拷贝;
- nyoj 104 最大和
- 寒假刷题—栈和队列
- 阅读计划
- Collections中sort()方法源代码的简单分析
- socket.io搭建分布式web推送服务器
- 关于欧拉筛求phi的讨论
- MySQL常见性能命令
- MySQL数据库服务器优化详细
- STM32f746G-DISCO开发使用
- 按钮也能随单机变化(ImageButton选择特效)
- 计算指定时间与当前的时间差
- innodb_flush_log_at_trx_commit
- mysql索引总结
- Cannot proceed with delivery: an existing transporter instance is currently uploading this package
- Autoconf/Automake工具简介
- Ajax异步交互 [异步对象连接服务器]
- 自动查询友链(普通链接也行)机器人