LeetCode--初级算法--回文链表

题目

请判断一个链表是否为回文链表。

示例 1:
输入: 1->2
输出: false

示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

解题方法

其实,链表的题目很大一部分都可以采用转换为数组的形式求解。如,这题:
采用数组,先遍历整个链表,用数组将链表中的数据存储下来,这样就变成了回文数组的问题了,前面数组中,已经提到过该方案,采用双指针,一个指针指向头,一个指证指向尾,每次比较这连个指针指向的数据是否相同,相同,头指针向右移动,尾指针向左移动,直到两个指针相同,退出比较。
图解:
在这里插入图片描述
方案二:
回文链表的特点是对称,那么要判断是否为回文链表,就可以用2个指证指向对称的节点,看里面的信息是否一样。由于是单向链表,不能用2个指针从头尾内部遍历取值比较,那么就可以考虑从链表的中间开始,用两个指针向两头遍历取值比较,这显然需要将链表逆置。
具体的做法是:先遍历一次链表,得到链表的长度。然后第二次遍历到链表中间,并且在遍历的时候进行逆置。然后两个指针分离,分别向两个端点移动,同时进行比较,数据相同则继续,不同则直接返回false,直到遍历完成,返回true。
在这里插入图片描述

代码:

/**
 * 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) 
    {
        int lenth, i;
        ListNode *point1, *point2, *point3;
        point3 = point2 = head;
        point1 = NULL;
        lenth = 0;
        if(head == NULL || head->next == NULL)
            return true;
        while(point3 != NULL)//取得长度
        {
            point3 = point3->next;
            lenth++;
        }
        for(i = 0;i < (lenth / 2);i++)//遍历到中间,并逆置
        {
            point3 = point2->next;
            point2->next = point1;
            point1 = point2;
            point2 = point3;
        }
        if((lenth % 2) == 1)
            point3 = point3->next;
        while(point3 != NULL && point1 != NULL)//两个指针开始向两头移动,取值比较
        {
            if(point3->val != point1->val)
                return false;
            point3 = point3->next;
            point1 = point1->next;
        }
        return true;//比较中没有发现不同值,则为回文链表
    }
};
发布了61 篇原创文章 · 获赞 89 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_33559992/article/details/89177985