1. Deleting node from singly linked list

Following code deletes the node in liked list just by traversing once. Wondering any other alternative method to achieve the same.

Code:
```Code for deleting a node

struct node
{
int data;
struct node *next;
}node;

struct node *first,*save,*new1;

{
if (!first)
{
first = (struct node *)malloc(sizeof(node));
first->next = NULL;
first->data = i;
save = first;
}
else
{
new1 = (struct node *)malloc(sizeof(node));
new1->data = i;
new1->next = NULL;
save->next = new1;
save = new1;
}
}

disp2()
{
struct node *first1 = first;

printf("\n\nNumbers are \n");

while ( first1 )
{
printf("%d\t",first1->data);
first1 = first1->next;
}
}

delete_nth_node_from_end(int n)
{
struct node *first1,*n_th_node,*save;
int count = 0;
save = first1 = n_th_node = first;

while ( first1->next )
{
first1 = first1->next;
count++;
if ( count == (n-1) )
break;
}

if ( count < (n-1) )
{
printf("Link list is not large enough\n");
return;
}

if ( first1->next == 0 )
{
first = n_th_node->next;
free(first);
return;
}

while ( first1->next != 0 )
{
first1 = first1->next;
save = n_th_node;
n_th_node = n_th_node->next;
}

save->next = n_th_node->next;
free(n_th_node);
return;
}

main()
{
int i;
int n;
while ( 1 )
{
printf("Enter the number:");
scanf("%d",&i);
if ( i )
else
break;
}
printf("\n\nBefore deletion\n");
disp2();
delete_nth_node_from_end(n = 4);
printf("\n\nAfter deletion\n");
disp2();
}```

2. I mean deleting nth node from end in single traverse.

3. >I mean deleting nth node from end in single traverse.