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

惭愧,翻开旧博客,三年多前看郝斌视频,写过一次链表(那个视频倒是没讲反转链表)。现在,好好学算法把。少年。
#include #includetypedef 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 = https://www.it610.com/article/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=https://www.it610.com/article/%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 = https://www.it610.com/article/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 =https://www.it610.com/article/= t1->data) { return 1; //表示有环的存在 } printf("%d",t->data); t = t->pNext; t1 = t1->pNext->pNext; } return 0; }

参考资料:
【【轻知识】反转链表、快慢指针检查环】《鏈表》http://yanshinian.com/lianbiao

    推荐阅读