使链表中的中间节点成为头部的 C 程序
给定一个单链表,找到链表的中间节点,并将链表的中间节点设置在链表的开头。
例子:
Input: 1 2 3 4 5
Output: 3 1 2 4 5
Input: 1 2 3 4 5 6
Output: 4 1 2 3 5 6
这个想法是首先使用两个指针找到链表的中间,第一个一次移动一个,第二个一次移动两个。当第二个指针到达终点时,第一个到达中间。我们还跟踪第一个指针的前一个,以便我们可以将中间节点从其当前位置移除并使其成为头部。
C
// C program to make middle node as
// head of linked list.
#include
#include
// Link list node
struct Node
{
int data;
struct Node* next;
};
/* Function to get the middle and set at
beginning of the linked list*/
void setMiddleHead(struct Node** head)
{
if (*head == NULL)
return;
// To traverse list nodes one by one
struct Node* one_node = (*head);
// To traverse list nodes by skipping
// one.
struct Node* two_node = (*head);
// To keep track of previous of middle
struct Node* prev = NULL;
while (two_node != NULL &&
two_node->next != NULL)
{
// For previous node of middle node
prev = one_node;
// Move one node each time
two_node = two_node->next->next;
// Move two node each time
one_node = one_node->next;
}
// Set middle node at head
prev->next = prev->next->next;
one_node->next = (*head);
(*head) = one_node;
}
// To insert a node at the beginning
// of linked list.
void push(struct Node** head_ref,
int new_data)
{
// Allocate node
struct Node* new_node =
(struct Node*)malloc(sizeof(struct Node));
new_node->data = new_data;
// Link the old list off the new node
new_node->next = (*head_ref);
// Move the head to point to the
// new node
(*head_ref) = new_node;
}
// A function to print a given linked list
void printList(struct Node* ptr)
{
while (ptr != NULL)
{
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("");
}
// Driver code
int main()
{
// Create a list of 5 nodes
struct Node* head = NULL;
int i;
for (i = 5; i > 0; i--)
push(&head, i);
printf(" list before: ");
printList(head);
setMiddleHead(&head);
printf(" list After: ");
printList(head);
return 0;
}
输出:
list before: 1 2 3 4 5
list After : 3 1 2 4 5
请参考完整文章在链表中制作中间节点头以获取更多详细信息!