基础数据结构练习(栈)

  • 算法题目

回文链表

回文链表

  • 题目简介

题目:回文链表

  • 涉及知识点

链表结点、栈性质、(回文数组首尾性质)

  • 算法分析
  1. 创建一个栈,从头接收链表的元素
  2. 栈顶元素和链表头结点进行比较(同时出栈,链表向后访问)
  3. 对比中一旦发现不等返回false
  • 源码讲解

方法一

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

//单纯用栈,然后用栈顶和链表元素做对比
bool isPalindrome(struct ListNode* head) {
    int* stack = (int*)malloc(sizeof(int) * 100000);//为栈开辟空间
    int top = 0;
    //将head链表中的元素从头到尾依次赋值给tmp
    struct ListNode* tmp = head;
    while(tmp)
    {
        stack[top++] = tmp->val;
        tmp = tmp->next;
    }
    //一个从栈顶出发,一个从链表头指针出发
    while(top--)
    {
        if(stack[top] != head->val)
        {
            return false;
        }
        head = head->next;
    }
    
    free(stack);//释放内存
    return true;
}

方法二

也可以选择用 判断数组首尾是否相等

这里我们拿stack来当做数组,判断首尾。时间复杂度会小一些

bool isPalindrome(struct ListNode* head) {
    int* stack = (int*)malloc(sizeof(int) * 100000);
    int top = 0;
    //这里可以不用创建tmp
    while(head)
    {
        stack[top++] = head->val;
        head = head->next;
    }

    //数组首尾判断法
    int low = 0;
    int high = top - 1;//尾

    while(low < high)
    {
        if(stack[low] != stack[high])
            return false;
        high--;
        low++;
    }
    
    free(stack);
    return true;
}
  • FAQ
  1. 方法一,while中的top是每调用一次top就–,而不是等到循环结束了top才-- (top也表示栈长类似数组长,while循环第一次进行时,top就变成 栈长-1,在循环中,即栈长-1参与运算,没有越界现象)
  2. 方法一,创建临时变量tmp,是因为两个循环都要从链表头指针出发(头指针向后容易,向前难)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值