用于在链表中制作中间节点头部的 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
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
请参考完整文章在链表中制作中间节点头以获取更多详细信息!