📌  相关文章
📜  用于重新排列链表的 C 程序,以使所有偶数和奇数位置的节点都在一起

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

用于重新排列链表的 C 程序,以使所有偶数和奇数位置的节点都在一起

重新排列链表,使所有奇数位置节点在一起,所有偶数位置节点在一起,
例子:

Input:   1->2->3->4
Output:  1->3->2->4

Input:   10->22->30->43->56->70
Output:  10->30->56->22->43->70

这个问题的重要一点是确保处理以下所有情况

  1. 空链表。
  2. 只有一个节点的链表。
  3. 只有两个节点的链表。
  4. 具有奇数个节点的链表。
  5. 具有偶数个节点的链表。

下面的程序分别为奇数和偶数位置的当前节点维护两个指针“奇数”和“偶数”。我们还存储了偶数链表的第一个节点,以便在所有奇数和偶数节点在两个不同的链表中连接在一起之后,我们可以将偶数链表附加到奇数链表的末尾。

C
// C program to rearrange a linked list in 
// such a way that all odd positioned node 
// are stored before all even positioned 
// nodes
#include
using namespace std;
  
// Linked List Node
struct Node
{
    int data;
    struct Node* next;
};
  
// A utility function to create a 
// new node
Node* newNode(int key)
{
    Node *temp = new Node;
    temp->data = key;
    temp->next = NULL;
    return temp;
}
  
// Rearranges given linked list such that 
// all even positioned nodes are before 
// odd positioned. Returns new head of 
// linked List.
Node *rearrangeEvenOdd(Node *head)
{
    // Corner case
    if (head == NULL)
        return NULL;
  
    // Initialize first nodes of even 
    // and odd lists
    Node *odd = head;
    Node *even = head->next;
  
    // Remember the first node of even 
    // list so that we can connect the 
    // even list at the end of odd list.
    Node *evenFirst = even;
  
    while (1)
    {
        // If there are no more nodes, then 
        // connect first node of even list 
        // to the last node of odd list
        if (!odd || !even || !(even->next))
        {
            odd->next = evenFirst;
            break;
        }
  
        // Connecting odd nodes
        odd->next = even->next;
        odd = even->next;
  
        // If there are NO more even 
        // nodes after current odd.
        if (odd->next == NULL)
        {
            even->next = NULL;
            odd->next = evenFirst;
            break;
        }
  
        // Connecting even nodes
        even->next = odd->next;
        even = odd->next;
    }
  
    return head;
}
  
// A utility function to print a 
// linked list
void printlist(Node * node)
{
    while (node != NULL)
    {
        cout << node->data << "->";
        node = node->next;
    }
    cout << "NULL" << endl;
}
  
// Driver code
int main(void)
{
    Node *head = newNode(1);
    head->next = newNode(2);
    head->next->next = newNode(3);
    head->next->next->next = newNode(4);
    head->next->next->next->next = newNode(5);
  
    cout << "Given Linked List";
    printlist(head);
  
    head = rearrangeEvenOdd(head);
  
    cout << "Modified Linked List";
    printlist(head);
  
    return 0;
}


输出:

Given Linked List
1->2->3->4->5->NULL
Modified Linked List
1->3->5->2->4->NULL

请参阅有关重新排列链表的完整文章,以便所有偶数和奇数位置的节点都在一起以获取更多详细信息!