基础数据结构练习(栈)

发布时间:2024年01月12日
  • 算法题目

回文链表

回文链表

  • 题目简介

题目:回文链表

  • 涉及知识点

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

  • 算法分析
  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,是因为两个循环都要从链表头指针出发(头指针向后容易,向前难)
文章来源:https://blog.csdn.net/HXD_stranger/article/details/135515274
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。