[leetcode] 234.Palindrome Linked List

原创 2015年07月10日 11:23:25

题目:
Given a singly linked list, determine if it is a palindrome.

Follow up:
Could you do it in O(n) time and O(1) space?
题意:
给定一个链表,验证其是不是回文的,即从两头往中间元素是相等的。
思路:
由于需要空间复杂度是O(1)。如果没有这个要求使用O(n)的空间复杂度,可以直接使用一个栈将元素从头到尾入栈,那么出栈时就可以从尾到头依次出栈,然后比较从头到尾的链表元素与从栈中出来的从尾到头的元素是否相等。
代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(head == NULL)return true;
        stack<ListNode*>s;
        ListNode* tmp = head;
        while(tmp != NULL) {
            s.push(tmp);
            tmp = tmp->next;
        }
        while(!s.empty()) {
            ListNode* node = s.top();
            s.pop();
            if(node->val != head->val)return false;
            head = head->next;
        }
        return true;
    }
};

但是现在要求是O(1)的空间复杂度,所以不能使用栈来装元素。可以采用翻转链表后一半元素的方法。比如原来元素是1->2->3->2->1,逆转后半部分后链表就是1->2->3->1->2,那么只要从后半部分的第一个元素以及前半部分的第一个元素开始往后遍历。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(head == NULL || head->next == NULL)return true;
        int count = 0;
        ListNode* tmp = head;
        while(tmp != NULL){
            count++;
            tmp = tmp->next;
        }
        int middle = count / 2;
        tmp = head;
        ListNode* last = NULL;
        for(int i = 0; i < middle; i++) {
            last = tmp;
            tmp = tmp->next;
        }
        if(count % 2) {
            last = last->next;
            tmp = tmp->next;
        }
        tmp = reverseList(tmp);
        while(tmp != NULL) {
            if(head->val != tmp->val)return false;
            head = head->next;
            tmp = tmp->next;
        }
        return true;
    }
    ListNode* reverseList (ListNode * now) {
        ListNode* past = NULL;
        ListNode* future = now;
        while(future != NULL) {
            future = future->next;
            now->next = past;
            past = now;
            now = future;
        }
        return past;
    }
};

【LeetCode-面试算法经典-Java实现】【160-Intersection of Two Linked Lists(单链表的交集)】

【160-Intersection of Two Linked Lists(单链表的交集)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Write a program ...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月22日 06:45
  • 3200

【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】

【092-Reverse Linked List II(反转单链表II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Reverse a linked list fro...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月06日 07:40
  • 1650

LeetCode刷题系列(七)Linked List

本篇是有关Linked List的几道相关题型,涉及链表的一些基本的操作和技巧,这些之前的blog也有提到过。Sort List  题目为把一个链表进行排序,要求时间复杂度为O(nlgn)。链表我们一...
  • lingyun_fay
  • lingyun_fay
  • 2016年06月14日 23:03
  • 96

面试算法:Linked List-链 表

Linked List-链 表 很多面试相关的书籍都有链表和字符串操作相关的题,这类问题更考验编程基本功和对基础知识的掌握情况。由于之前很多题目做过就忘,再做时总是磕磕绊绊,说明没有真正消化...
  • bobbycho
  • bobbycho
  • 2016年10月23日 20:02
  • 80

C++实现单链表(Singly-Linked List)追加、遍历、删除

#include using namespace std; struct Node { int data; struct Node* next; }; class List { Node* ...
  • wupeak
  • wupeak
  • 2015年01月27日 00:13
  • 646

C++:实现LinkedList 学习抽象数据类型

C++:实现LinkedList 学习抽象数据类型标签(空格分隔): c++ 数据结构 作者:陈小默C实现LinkedList 学习抽象数据类型 定义需求 作为类 作为List 作为栈stack 作...
  • qq_32583189
  • qq_32583189
  • 2016年09月04日 17:36
  • 3328

C实现 LeetCode->Reverse Linked List (双指针大法)(单链表反转)

Reverse a singly linked list. /**  *  Reverse a singly linked list    反转单链表,请牢记 Reverse()...
  • liutianshx2012
  • liutianshx2012
  • 2015年06月22日 15:04
  • 501

链表(LinkedList) C 语言实现

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。如图: 下面是代码实现: #include #include struct stud...
  • song_hui_xiang
  • song_hui_xiang
  • 2015年07月24日 15:29
  • 1589

linked-list-cycle-ii(有环链表的第一个公共节点)

题目描述: Given a linked list, return the node where the cycle begins. If there is no cycle, returnnul...
  • zh_ang_lei
  • zh_ang_lei
  • 2016年09月25日 23:39
  • 216

LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)

翻译反转一个单链表。原文Reverse a singly linked list.分析我在草纸上以1,2,3,41,2,3,4为例,将这个链表的转换过程先用描绘了出来(当然了,自己画的肯定不如博客上面...
  • NoMasp
  • NoMasp
  • 2016年01月14日 06:22
  • 3765
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[leetcode] 234.Palindrome Linked List
举报原因:
原因补充:

(最多只允许输入30个字)