链表、队列、栈的相关应用(一)链表的回文结构

本文介绍了一种判断链表是否为回文结构的方法,通过快慢指针找到中点,并反转后半部分进行对比,或者使用栈来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在对学习的链表、队列、栈等进行学习与总结,将遇到的题目总结出来,供大家交流

知识点:链表、栈

题目:

对于一个链表,,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {

}

};


思路:

1.利用快慢指针,快指针每次进两格,慢指针每次进一格,当快指针指到NULL末尾时,慢指针指到中间位置

2.逆序指针

3.从头尾指针进行比较


代码:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        // write code here
      
        if(A->next == NULL)//只有一个元素为回文
            return true;
        else if(A == NULL)//空元素不是回文
            return false; 
        //快慢指针找出中间节点
        ListNode *fast = A;//均指向头结点
        ListNode *slow = A;
        ListNode *temp, *cur;
        while(fast->next != NULL && fast != NULL) //保证fast的下下个节点不为空
        {
           // temp = slow; // temp 是保存slow的前一个节点,即第一部分的最后一个节点
            fast = fast->next->next;
            slow = slow->next;// 为奇数,slow为中间节点,偶数时,slow为第二部分第一个节点
        }//跳出程序的时候slow为中间节点
        
        cur = slow->next;
        slow ->next = NULL;
        
        //反转链表
        while(cur!=NULL)  
          {  
            temp = cur->next;      //mid,cur,temp三个指针操作反转链表。  
            cur->next = slow;  
            slow = cur;  
            cur = temp;  
          } 
        while(A != NULL && slow != NULL)  
            {  
            if(A->val == slow->val)  
                {  
                A = A->next;  
                slow = slow->next;  
            }  
            else
                return false;  
        } 
        return true;
    }
   

思路2:复制链表A,将链表中的元素通过push压入栈,再利用出栈,比较stack.top()(尾部元素) 和链表A(头部元素)是否相等

代码:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {  
public:  
    bool chkPalindrome(ListNode* A) { 
        if(A==NULL)
            return true;
        ListNode *B ;
        B = A;
        stack<int> st;


        while(B != NULL)
        {
            st.push(B->val);
            B = B->next;
        }
        
        while(A != NULL)
        {
            if(st.top() == A->val)
            {
                st.pop();
                A = A->next;
            }
            else 
                return false;
        }
        return true;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值