'What is the best way to create/reverse a linked list? [closed]

I'm a beginner at programming and I've learnt how to reverse a linked list. Below is the code I used to make a linked list with random values and reverse it. I was wondering what the best way to do this would be. Thanks for your suggestions! Have a great day!

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

// node
typedef struct node{
    int number;
    struct node *next;
}node;

// functions
node *reversedList(node *head);
void printList(node *head);
node *create(int size);

int main(void)
{
    srand(time(0));
    // ........
}

node *reversedList(node *curr)
{
    // a->b->c->d
    // d->c->b->a
    node *previous = NULL;
    while(curr->next != NULL)
    {
        node *curr_temp = curr->next;
        curr->next = previous;
        previous = curr;
        curr = curr_temp;
    }
    curr->next = previous;
    return curr;
}

void printList(node *head)
{
    if (head == NULL)
        return;
    printf("%d ",head->number);
    printList(head->next);
}

node *create(int size)
{
    if(size == 0)
        return NULL;
    node *n = malloc(sizeof(node));
    n->number = rand() % 10;
    n->next = create(size - 1);
    return n;   
}


Solution 1:[1]

Side note: Curiously, you did an iterative solution for reversal, but did a recursive solutions for create and printList

Your function is pretty close to optimal.

But, you fetched curr->next twice. Admittedly, with an optimizer, there should be no extra speed penalty.

But, I'd simplify that. And, I think a for loop can be cleaner:

node *
reversedFor(node *curr)
{
    // a->b->c->d
    // d->c->b->a
    node *prev = NULL;
    node *next;

    for (;  curr != NULL;  curr = next) {
        next = curr->next;
        curr->next = prev;
        prev = curr;
    }

    return prev;
}

Edit: And, as Vlad mentioned, you don't check for curr being non-null before dereferencing it. So, my above refactoring fixed the bug with a bit of serendipity.


Here's what I'd to clean everything up:

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

// node
typedef struct node {
    int number;
    struct node *next;
} node;

// functions
node *reversedList(node *head);
node *reversedFor(node *head);
void printList(node *head,const char *tag);
node *create(int size);
node *delList(node *head);

typedef node *(revfnc_p)(node *head);

void
dotest(revfnc_p fnc,const char *tag)
{
    node *list;

    printf("dotest: %s\n",tag);

    list = create(10);
    printList(list,"orig");

    list = fnc(list);
    printList(list,"revd");

    delList(list);
}

int
main(void)
{

    dotest(reversedList,"reversedList");
    dotest(reversedFor,"reversedFor");

    return 0;
}

node *
reversedList(node *curr)
{
    // a->b->c->d
    // d->c->b->a
    node *previous = NULL;

    while (curr->next != NULL) {
        node *curr_temp = curr->next;

        curr->next = previous;
        previous = curr;
        curr = curr_temp;
    }
    curr->next = previous;
    return curr;
}

node *
reversedFor(node *curr)
{
    // a->b->c->d
    // d->c->b->a
    node *prev = NULL;
    node *next;

    for (;  curr != NULL;  curr = next) {
        next = curr->next;
        curr->next = prev;
        prev = curr;
    }

    return prev;
}

void
printList(node *head,const char *tag)
{

    if (tag != NULL)
        printf("%s:",tag);

    for (node *curr = head;  curr != NULL;  curr = curr->next)
        printf(" %d",curr->number);

    printf("\n");
}

node *
create(int size)
{
    node *head = NULL;
    node *prev = NULL;
    node *curr;

    for (int idx = 0;  idx < size;  ++idx) {
        curr = malloc(sizeof(*curr));
        curr->number = idx;
        curr->next = NULL;

        if (head == NULL)
            head = curr;
        else
            prev->next = curr;

        prev = curr;
    }

    return head;
}

node *
delList(node *curr)
{
    node *next;

    for (;  curr != NULL;  curr = next) {
        next = curr->next;
        free(curr);
    }

    return curr;
}

Here's the program output:

dotest: reversedList
orig: 0 1 2 3 4 5 6 7 8 9
revd: 9 8 7 6 5 4 3 2 1 0
dotest: reversedFor
orig: 0 1 2 3 4 5 6 7 8 9
revd: 9 8 7 6 5 4 3 2 1 0

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1