美文网首页
链表求中点以及回文检测

链表求中点以及回文检测

作者: 熊白白 | 来源:发表于2017-07-16 20:24 被阅读23次

以前见到一个题目,求链表的倒数第K个结点。实现方式很巧妙:

  1. 让一个指针先走K步
  2. 然后另一个指针从头开始,两者同时开始走。
  3. 前指针走完了,那后指针一定是在倒数第K个位置。

求链表的中点问题,也可以利用这种思路:

  1. 前指针一次走两步,后指针一次走一步。
  2. 前指针走完了,后指针一定在中间位置。

当然,这其中也有很多问题,比如结点数目是奇数偶数的时候,中间位置怎么定义。
在这里,我们定义结点编号从1开始到N,中间结点是N/2向下取整。

    ListNode* mid(ListNode* pHead) {
        ListNode* H=new ListNode(0);
        H->next=pHead;
        ListNode* fast=H,*slow=H;
        while(fast->next && fast->next->next){
            fast=fast->next->next;
            slow=slow->next;
        }
        ListNode* m=slow;
        delete H;
        return m;
    }

注意

在这里我手动加了个头结点,来完成这个过程。其实多数情况下带头结点的链表用起来会方便很多。

链表回文检测

检测链表的回文结构,最容易的方式就是把链表内容拷贝进入数组中进行检测,但是需要O(N)的额外空间。
这里提供的方法是找到链表的中点,然后把链表后半部分反转。这样从链表的首尾就可以开始检测,逐个比对。


无论是奇数还是偶数,遍历过程都是一样的,m2都是在N/2的位置。检测的时候尾指针从right一直遍历到空即可。
注意slow和m2的链接没有改变。
注意判断完以后把链表及时纠正回来。

    bool isPalindrome(ListNode* pHead) {
        // write code here
        ListNode* H=new ListNode(0);
        H->next=pHead;
        ListNode* fast=H,*slow=H;
        while(fast){
            if(fast->next && fast->next->next){
                fast=fast->next->next;
                slow=slow->next;
            }else{
                break;
            }
        }
        ListNode* m2=slow->next;
        
        ListNode* right=reverL(m2,nullptr);
        ListNode* h1=pHead,*h2=right;
        bool match=1;
        while(h2){
            if(h1->val!=h2->val){
                match=0;
                break;
            }else{
                h1=h1->next;
                h2=h2->next;
            }
        }
        m2=reverL(right,nullptr);
        delete H;
        return match;
    }

相关文章

  • 链表求中点以及回文检测

    以前见到一个题目,求链表的倒数第K个结点。实现方式很巧妙: 让一个指针先走K步 然后另一个指针从头开始,两者同时开...

  • 234. Palindrome Linked List

    判断一个链表是不是回文链表 获取链表的中点,根据快慢指针,将后半部分反转,然后从中点逐个比较。 Runtime: ...

  • 热题HOT 100(61-70)

    61.请判断一个链表是否为回文链表。 简单想法,找到中点,翻转后面的链表,对比两边是否一样!比如[1, 2, 2,...

  • 关于链表经典算法题都在这里了

    1.单链表反转(LeetCode 206) 2.链表中环的检测 (LeetCode 141) 3.求链表中环开始结...

  • 常见算法总结

    链表 单链表反转链表中环的检测两个有序的链表合并删除链表倒数第 n 个结点求链表中间第n个节点

  • 链表

    链表 单链表反转链表中环的检测两个有序链表合并删除链表倒数第n个节点求链表的元素总个数 一.单向链表 链表共有特征...

  • 【日拱一卒】链表——回文判断

    需求 判断一个链表是否是回文链表 回文的形式大家应该都知道,类似 这种对称的方式都是回文。 难点 如果将链表形式换...

  • LeetCode 234. 回文链表

    234. 回文链表 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2输出: false 示例 2: 输...

  • 漫谈递归-回文链表

    题目 234. 回文链表请判断一个链表是否为回文链表。 测试 示例 1:输入: 1->2输出: false 示例 ...

  • 5. 用链表检测回文

    前年面摩根士丹利的时候被Joshua大哥问过的题。当时墨迹半天我也只是说出来要把链表反转一下再比较。(结果还是被要...

网友评论

      本文标题:链表求中点以及回文检测

      本文链接:https://www.haomeiwen.com/subject/gclxkxtx.html