• 链表编程练习


    深刻感觉,基础很重要,闲暇时间,做简单链表编程练习。

    #ifndef __LIST_H_
    #define __LIST_H_
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct LinkNodeList
    {
        int data;
        struct LinkNodeList* next;
    } LinkNode;
    
    LinkNode* LinkListCreate(const int n);
    LinkNode* LinkListReverse(LinkNode* head);
    LinkNode* LinkListReverse1(LinkNode* head);
    int IsPalindrome(LinkNode* head);
    #endif
    #include "list.h"
    
    int a[5] = {1, 2, 5, 2, 1};
    
    /*创建链表 n:链表结点个数*/
    LinkNode* LinkListCreate(const int n)
    {
        int i;
        LinkNode* head;
        LinkNode* pre;
        head = (LinkNode*)malloc(sizeof(LinkNode));
        head->next = NULL;
        pre = head;
        LinkNode* p;
        for (i = 0; i < n; i++)
        {
            p = (LinkNode*)malloc(sizeof(LinkNode));
            p->data = a[i];
            p->next = NULL;
            pre->next = p;
            pre = p;
        }
        return head;
    }
    /*翻转链表 n:链表头节点*/
    LinkNode* LinkListReverse(LinkNode* head)
    {
        if ((NULL == head) || (NULL == head->next))
        {
            return NULL;
        }
        LinkNode* pre = NULL;
        LinkNode* Next = NULL;
        LinkNode* Cur = head->next;
        while (Cur != NULL)
        {
            Next = Cur->next;
            Cur->next = pre;
            pre = Cur;
            Cur = Next;
        }
        head->next = pre;
        return head;
    }
    
    /*递归翻转链表 n:链表头节点*/
    LinkNode* LinkListReverse1(LinkNode* head)
    {
        LinkNode* new_head;
        if ((NULL == head) || (NULL == head->next))
        {
            return head;
        }
        else
        {
            new_head = LinkListReverse1(head->next);
            head->next->next = head;
            head->next = NULL;
            return new_head;
        }
    }
    
    /*判断是否是回文*/
    int IsPalindrome(LinkNode* head)
    {
        if (NULL == head)
        {
            return -1;
        }
        /*快慢指针*/
        LinkNode* fast = head->next;
        LinkNode* slow = head->next;
        while (fast != NULL && fast->next != NULL)
        {
            
            fast = fast->next->next;
            slow = slow->next;
        }
        //printf("slow data%d
    ", slow->data);
        LinkNode* cur = slow;
        LinkNode* next = NULL;
        LinkNode* pre = NULL;
        while (cur != NULL)
        {
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        
        LinkNode* p1 = head->next;
        LinkNode* p2 = pre;
        while(p1 != NULL)
        {
            if((p1->data) != (p2->data))
            {
                return -1;
            }
            //printf("p1 data%d
    ", p1->data);
            //printf("p2 data%d
    ", p2->data);
            p1 = p1->next;
            p2 = p2->next;
            
        }
        
        return 0;
    }
    int main()
    {
        LinkNode* head = LinkListCreate(5);
        printf("%d
    ", IsPalindrome(head));
        // LinkNode* p = head->next;
        // while(p != NULL)
        // {
            // printf("%d
    ", p->data);
            // p = p->next;
        // }
        // LinkNode* p1 = LinkListReverse1(head);
        // while(p1 != NULL)
        // {
            // printf("%d
    ", p1->data);
            // p1 = p1->next;
        // }
        while(head != NULL)
        {
            LinkNode* f = head;
            head = head->next;
            free(f);
        }
        return 0;
    }
  • 相关阅读:
    [Android应用开发] 01.快速入门
    [wordpress使用]004_导入多媒体
    【Python3爬虫】使用异步协程编写爬虫
    【Python3爬虫】斗鱼弹幕爬虫
    Pycharm2018永久破解的办法
    【Python3爬虫】大众点评爬虫(破解CSS反爬)
    【Python3爬虫】用Python发送天气预报邮件
    【Python3爬虫】猫眼电影爬虫(破解字符集反爬)
    【Python3爬虫】微博用户爬虫
    【Python3爬虫】拉勾网爬虫
  • 原文地址:https://www.cnblogs.com/zzdbullet/p/10462022.html
Copyright © 2020-2023  润新知