您的位置:首页 > 其它

reverse a linked list -- C

2018-01-24 19:02 204 查看
/******************************************************************************************
* main.c
* Created on:      24-Jan-2018 20:25:28
* Original author: linx
* Computer Science & Technology, Linx
* Copyright (c) 2018-2020. All rights reserved.
******************************************************************************************/

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

typedef int datatype;

typedef struct node_t {
datatype value;
struct node_t *next;
} node, *link;

static const int kLIST_CNT = 5;

int add_node(link *head, datatype data);
void reverse_link(link *head);
/*void reverse_link_1(link *head);*/
link reverse_link_ret(link head);
link reverse_recursive(link head);
void traverse_link(link head);
void release_link(link *head);

int runtest();

int main() {
runtest();
return 0;
}

int runtest() {
link head = NULL;
int loop = kLIST_CNT;
while (loop > 0)
add_node(&head, loop--);

traverse_link(head);

reverse_link(&head);
traverse_link(head);

link relnk = reverse_link_ret(head);
traverse_link(relnk);

link recursive = reverse_recursive(relnk);
traverse_link(recursive);

release_link(&recursive);
return 0;
}

int add_node(link *head, datatype data) {
link newnode = (link)malloc(sizeof(*newnode));
if (NULL == newnode) {
return -1;
}
newnode->value = data;
newnode->next = *head;
*head = newnode;
return 0;
}

/*
void reverse_link_1(link *head) {
printf("%s\n", __FUNCTION__);
if (NULL == *head)
return;
link head_node = *head;
link current_node = (*head)->next;
head_node->next = NULL;
while (current_node) {
link next_node = current_node->next;
current_node->next = head_node;
head_node = current_node;
*head = current_node;
current_node = next_node;
}
}
*/

void reverse_link(link *head) {
printf("%s\n", __FUNCTION__);
link prev = NULL;
link current = *head;
link next = NULL;
while (NULL != current) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
*head = prev;
}

link reverse_link_ret(link current) {
printf("%s\n", __FUNCTION__);
link prev = NULL;
link next = NULL;
while (NULL != current) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}

link reverse_recursive(link head) {
printf("%s\n", __FUNCTION__);
if (NULL == head || NULL == head->next)
return head;
link tmp = reverse_recursive(head->next);
head->next->next = head;
head->next = NULL;
return tmp;
}

void traverse_link(link head) {
printf("%s\n", __FUNCTION__);
while (NULL != head) {
printf("%d->%s", head->value, head->next ? "": "NULL\n");
head = head->next;
}
printf("\n");
}

void release_link(link *head) {
printf("%s\n", __FUNCTION__);
while (NULL != *head) {
link tmp = *head;
printf("%d->%s", tmp->value, tmp->next ? "": "NULL\n");
*head = (*head)->next;
free(tmp);
tmp = NULL;
}
}


original
geeksforgeeks
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: