每天一道LeetCode-----回文链表

来源:互联网 发布:怎么在知乎提问 编辑:程序博客网 时间:2024/05/22 03:57

Palindrome Linked List

原题链接这里写链接内容
这里写图片描述
意思是判断链表是不是回文的


回文数都一样,左边和右边相等,重点是要找到中心位置,链表的中心位置比较不容易找,这里主要记录一种方法。
中心位置肯定就是总数除以2,那么只需要两个指针从头开始,一个步长为1,一个步长为2,最后步长为1的指针指向的就是链表中心

ListNode *find_center(ListNode* head){    ListNode* walker = head;    ListNode* runner = head;    while(runner->next && runner->next->next)    {        walker = walker->next;        runner = runner->next->next;    }    return walker;}

找到的walker就是链表的中心,比如说

链表为1 -> 2 -> 3 -> 4walker指向2链表为1 -> 2 -> 3walker指向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)            return true;        ListNode *walker = head;        ListNode *runner = head;        while(runner->next && runner->next->next)        {            walker = walker->next;            runner = runner->next->next;        }        walker->next = reverse_list(walker->next);        walker = walker->next;        runner = head;        while(walker)        {            if(walker->val != runner->val)                return false;            walker = walker->next;            runner = runner->next;        }        return true;    }private:    ListNode* reverse_list(ListNode* head)    {        ListNode* cur_node = head;        ListNode* last_node = NULL;        while(cur_node)        {            ListNode* next_node = cur_node->next;            cur_node->next = last_node;            last_node = cur_node;            cur_node = next_node;        }        return last_node;    }};


划重点
有道题是判断一个链表是否有环,也可以使用walker和runner的方法判断,等遇见了再说把,大致思路如下

ListNode *walker = head;ListNode *runner = head;while(runner->next && runner->next->next){    walker = walker->next    runner = runner->next->next;    if(walker == runner)        return true;}return false;
原创粉丝点击