📌  相关文章
📜  使链表中的中间节点成为头部的 C 程序

📅  最后修改于: 2022-05-13 01:57:39.389000             🧑  作者: Mango

使链表中的中间节点成为头部的 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 

https://media.geeksforgeeks.org/wp-content/uploads/Capturedsdw.png

这个想法是首先使用两个指针找到链表的中间,第一个一次移动一个,第二个一次移动两个。当第二个指针到达终点时,第一个到达中间。我们还跟踪第一个指针的前一个,以便我们可以将中间节点从其当前位置移除并使其成为头部。

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 

请参考完整文章在链表中制作中间节点头以获取更多详细信息!