📌  相关文章
📜  用于在链表中制作中间节点头部的 C++ 程序

📅  最后修改于: 2022-05-13 01:57:44.171000             🧑  作者: 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 
using namespace std;
  
// Link list node 
class Node 
{ 
    public:
    int data; 
    Node* next; 
}; 
  
/* Function to get the middle and set at 
   beginning of the linked list*/
void setMiddleHead(Node** head) 
{ 
    if (*head == NULL) 
        return; 
  
    // To traverse list nodes one by one 
    Node* one_node = (*head); 
  
    // To traverse list nodes by skipping 
    // one. 
    Node* two_node = (*head); 
  
    // To keep track of previous of middle 
    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(Node** head_ref, int new_data) 
{ 
    // Allocate node 
    Node* new_node = new 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(Node* ptr) 
{ 
    while (ptr != NULL)
    { 
        cout << ptr->data << " "; 
        ptr = ptr->next; 
    } 
    cout< 0; i--) 
        push(&head, i); 
  
    cout << " list before: "; 
    printList(head); 
  
    setMiddleHead(&head); 
  
    cout << " list After: "; 
    printList(head); 
  
    return 0; 
} 
// This is code is contributed by rathbhupendra


输出:

list before: 1 2 3 4 5
list After : 3 1 2 4 5 

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