美文网首页PHP实战PHP经验分享
【轻知识】反转链表、快慢指针检查环

【轻知识】反转链表、快慢指针检查环

作者: 言十年 | 来源:发表于2019-04-23 00:45 被阅读12次

惭愧,翻开旧博客,三年多前看郝斌视频,写过一次链表(那个视频倒是没讲反转链表)。现在,好好学算法把。少年。

#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
    int data;
    struct Node* pNext;
} NODE,*PNODE;

PNODE create_list();
void traverse_list(PNODE);
PNODE reverse_list(PNODE);
int check_circle(PNODE pHead);
PNODE create_circle_list();
int main() {
    PNODE pHead = create_list();
    traverse_list(pHead);
    pHead = reverse_list(pHead);
    printf("--------\n");
    printf("%d", pHead->pNext->data);
    printf("%d", pHead->pNext->pNext->data);
    traverse_list(pHead);
    PNODE circle_list= create_circle_list();
    int is_circle = check_circle(circle_list);
    printf("is_circle=%d\n", is_circle);
}
PNODE create_list() {
    //1.首先mallc 一个地址
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (pHead == NULL) {
        printf("malloc error");
    }
    int len;
    printf("please input len:");
    scanf("%d", &len);
    printf("len=%d\n", len);
    PNODE tempNode = pHead;
    int i;
    for(i = 0;i < len;i++) {
        //分配节点
        PNODE newNode = (PNODE)malloc(sizeof(NODE));
        if (newNode == NULL) {
            printf("malloc error");
        }
        printf("please input value:");
        int val;
        scanf("%d", &val);
        newNode->data = val;
        newNode->pNext = NULL;
        tempNode->pNext = newNode;
        tempNode = newNode;
    }
    return pHead;
}
void traverse_list(PNODE pHead) {
    PNODE t = pHead->pNext;
    while(t != NULL) {
        printf("data=%d\n", t->data);
        t = t->pNext;
    }
    return ;
}
PNODE reverse_list(PNODE pHead) {
    PNODE t = pHead->pNext;
    PNODE reverse = NULL;
    PNODE tempNode = NULL;
    while(t != NULL) {
        tempNode = t->pNext;
        if (reverse == NULL) {
            reverse = t;
            reverse->pNext = NULL;
        } else {
            t->pNext = reverse;
            reverse = t;
        }
        t = tempNode;
    }
    pHead->pNext = reverse;
    return pHead;
}
PNODE create_circle_list() {
    //1.首先mallc 一个地址
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (pHead == NULL) {
        printf("malloc error");
    }
    int len;
    printf("please input len:");
    scanf("%d", &len);
    printf("len=%d\n", len);
    PNODE tempNode = pHead;
    int i;
    PNODE circleNode = NULL;
    for(i = 0;i < len;i++) {
        //分配节点
        PNODE newNode = (PNODE)malloc(sizeof(NODE));
        if (newNode == NULL) {
            printf("malloc error");
        }
        printf("please input value:");
        int val;
        scanf("%d", &val);
        newNode->data = val;
        newNode->pNext = NULL;
        tempNode->pNext = newNode;
        tempNode = newNode;

        if (circleNode == NULL && i == 2) {
            circleNode = newNode;
        }
        if (len == i+1) {
            newNode->pNext = circleNode;
        }
    }
    return pHead;
}
int check_circle(PNODE pHead) {
    PNODE t = pHead->pNext;
    PNODE t1 = t;
    while(t != NULL && t1 !=NULL) {
        if (t->data == t1->data) {
            return 1;//表示有环的存在
        }
        printf("%d",t->data);
        t = t->pNext;
        t1 = t1->pNext->pNext;

    }
    return 0;
}

参考资料:

《鏈表》http://yanshinian.com/lianbiao

相关文章

  • 【轻知识】反转链表、快慢指针检查环

    惭愧,翻开旧博客,三年多前看郝斌视频,写过一次链表(那个视频倒是没讲反转链表)。现在,好好学算法把。少年。 参考资...

  • 234. Palindrome Linked List

    知识点: 快慢指针 链表反转链表反转的四行代码必须熟记

  • 2.链表类的设计

    反转链表 检查是否是环形链表 快慢指针,快指针走两步,慢指针走一步,相遇或者能找到nil尾结点 删除链表中的重复元...

  • 链表

    单向链表 链表反转 判断是否有环,找链表的中间节点 快慢指针 找环的入口(求两个链表的交点可以转化成这个问题) p...

  • 算法学习--双指针

    双指针分类 快慢指针 左右指针 快慢指针:主要解决链表相关问题,比如:典型的判断链表中是否包含环、链表倒是第K个节...

  • 数据结构与算法整理

    (1)链表的技巧 快慢指针(找环,环入口,环长度) 双指针(倒数K个节点) 合并链表(递归求解) 约瑟夫环(环形链...

  • 纯C手撕leetcode-基本数据结构-链表

    技巧 假头 新链表 双指针(正反向指针,快慢指针) 递归 例子:1.合并两个有序链表(假头,新链表) 链表反转(假...

  • 快慢指针的应用

    什么是快慢指针:快慢指针是链表操作中的常用操作,最经典的应用是判断单链表中是否有环。 判断单链表是否存在环 两个指...

  • 234. 回文链表

    一. 题目: 二. 思路: 快慢指针找到中间结点,反转中间结点以后的链表 拿反转之后的链表和前面链表进行比较,如果...

  • leetcode刷题-链表

    链表题目汇总: 主要是发现 206 141环形链表(快慢指针) 21写递归 19 876 快慢指针,一个走2步,一...

网友评论

    本文标题:【轻知识】反转链表、快慢指针检查环

    本文链接:https://www.haomeiwen.com/subject/euapgqtx.html