zoukankan      html  css  js  c++  java
  • 链表编程练习

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

    #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;
    }
  • 相关阅读:
    03-HTML之body标签
    02-HTML之head标签
    01-HTML介绍
    第十五章 并发编程
    第十四章 网络编程
    第十三章 模块和包
    第十二章 异常和错误
    第十一章 面向对象进阶
    第九章 常用模块(续)
    003 配置负载均衡
  • 原文地址:https://www.cnblogs.com/zzdbullet/p/10462022.html
Copyright © 2011-2022 走看看