retagged by
2,326 views

2 Answers

Best answer
4 votes
4 votes
struct node* swap(struct node * head,struct node * tail)
{
        if(tail -> next != NULL)
                head = swap(head, tail->next);
        if(head == NULL)
                return NULL;
        tail -> next = head -> next;
        head->next = tail;
        head = tail -> next;
        if(head == tail){//End of recursion
                tail -> next = NULL;
                return NULL;
        }
        return head;
}

}
1 2 3 4 5 6; head is at 1, tail is at 6
1 6 2 3 4 5; head is at 2, tail is at 5
1 6 2 5 3 4; head is at 3; tail is at 4
1 6 2 5 3 4; head is at 4; tail is at 4 stop here. 

Full code:

/*Input the no. of items in list as parameter*/
#include <stdio.h>
#include <stdlib.h>
struct node{
	int data;
	struct node * next;
};
void initialize(struct node** head, int n)
{
	if(n == 0)
		return;
	printf("Enter the numbers of the list...\n");
	*head = malloc(sizeof(struct node)); //Our initial list now points to a valid memory location which is the start of the list
	scanf("%d", &((*head)->data));
	(*head) -> next = NULL;
	struct node *trav = *head; //Trav is used to complete the list, keeping head at beginning. 
	int i = 0;
	while(++i < n)
	{
		trav ->next = malloc(sizeof(struct node));
		trav = trav -> next;
		scanf("%d", &trav->data);
		trav -> next = NULL;
	}
	//Nothing to return as *head is updated at beginning
}
struct node* swap(struct node * head,struct node * tail)
{
	if(tail -> next != NULL)
		head = swap(head, tail->next);
	if(head == NULL)
		return NULL;
	tail -> next = head -> next;
	head->next = tail;
	head = tail -> next;
	if(head == tail){//End of recursion
		tail -> next = NULL;
		return NULL;
	}
	return head;
}
void printlist(struct node *head)
{
	printf("The current list is: \n");
	while(head != NULL){
		printf("%d\t", head-> data);
		head = head->next;
	}
	printf("\n");
}
int main(int argc, char* argv[])
{
	if(argc < 2)
	{
		fprintf(stderr, "Please enter no. of items as parameter...\n");
		exit(0);
	}
	struct node * list;
	initialize(&list, atoi(argv[1]));
	printlist(list);
	printf("Modifying....\n");
	swap(list, list->next);
	printlist(list);

}
selected by
0 votes
0 votes
What I did is, I copied the values of linked list to an array :D Then I put the values back to linked list as per requirement. Anyway recursion will also cost you space ...array too ...so my argument is clear..

void fun(struct node *root)
{
    int a[100];
    struct node *t=root->next;
    int c=1,i=0,j=0;
    while(t!=NULL)
    {
        a[i]=t->value;
        i++;
        t=t->next;
    }
    t=root->next;
    c=1;
    j=0;
    i--;
    while(t!=NULL)
    {
        if(c%2==1)
        {
        t->value=a[i];
        i--;
        }
        else
        {
            t->value=a[j];
            j++;
        }
        c++;
        t=t->next;
    }
}
edited by

Related questions

0 votes
0 votes
2 answers
1
srestha asked Apr 29, 2019
718 views
Can somebody write the code or algorithm, how merge sort works efficiently in linked list? Is Heap sort most inefficient in Linked List Sorting? Elaborate plz
0 votes
0 votes
1 answer
2
Mrityudoot asked Feb 25
144 views
How can we find the highest element in a singly linked list in O(1)? We are free to use any extra space.
0 votes
0 votes
1 answer
4
Vaishnavi01 asked Sep 17, 2018
635 views
struct node* foo(struct node* a, struct node* b){ struct node* result, *rec; if(a==null) return b; else if(b==null) return a; else { rec=foo(a->next,b->next...