📌  相关文章
📜  重新排列链表,使所有偶数和奇数定位节点都在一起

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

重新排列链表,使所有偶数和奇数定位节点都在一起

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

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
class Node
{
    public:
    int data;
    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\n";
    printlist(head);
 
    head = rearrangeEvenOdd(head);
 
    cout << "Modified Linked List\n";
    printlist(head);
 
    return 0;
}
 
// This is code is contributed by rathbhupendra


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\n";
    printlist(head);
 
    head = rearrangeEvenOdd(head);
 
    cout << "\nModified Linked List\n";
    printlist(head);
 
    return 0;
}


Java
// Java program to rearrange a linked list
// in such a way that all odd positioned 
// node are stored before all even positioned nodes
class GfG
{
 
// Linked List Node
static class Node
{
    int data;
    Node next;
}
 
// A utility function to create a new node
static 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.
static 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 == 1)
    {
        // If there are no more nodes, 
        // then connect first node of even 
        // list to the last node of odd list
        if (odd == null || even == null ||
                        (even.next) == null)
        {
            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
static void printlist(Node node)
{
    while (node != null)
    {
        System.out.print(node.data + "->");
        node = node.next;
    }
    System.out.println("NULL") ;
}
 
// Driver code
public static void main(String[] args)
{
    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);
 
    System.out.println("Given Linked List");
    printlist(head);
 
    head = rearrangeEvenOdd(head);
 
    System.out.println("Modified Linked List");
    printlist(head);
}
}
 
// This code is contributed by Prerna saini


Python3
# Python3 program to rearrange a linked list
# in such a way that all odd positioned
# node are stored before all even positioned nodes
 
# Linked List Node
class Node:
    def __init__(self, d):
        self.data = d
        self.next = None
 
class LinkedList:
    def __init__(self):
        self.head = None
         
    # A utility function to create
    # a new node
    def newNode(self, key):
        temp = Node(key)
        self.next = None
        return temp
 
    # Rearranges given linked list
    # such that all even positioned
    # nodes are before odd positioned.
    # Returns new head of linked List.
    def rearrangeEvenOdd(self, head):
         
        # Corner case
        if (self.head == None):
            return None
 
        # Initialize first nodes of
        # even and odd lists
        odd = self.head
        even = self.head.next
 
        # Remember the first node of even list so
        # that we can connect the even list at the
        # end of odd list.
        evenFirst = even
 
        while (1 == 1):
             
            # If there are no more nodes,
            # then connect first node of even
            # list to the last node of odd list
            if (odd == None or even == None or
                              (even.next) == None):
                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 == None):
                even.next = None
                odd.next = evenFirst
                break
 
            # Connecting even nodes
            even.next = odd.next
            even = odd.next
        return head
 
    # A utility function to print a linked list
    def printlist(self, node):
        while (node != None):
            print(node.data, end = "")
            print("->", end = "")
            node = node.next
        print ("NULL")
         
    # Function to insert a new node
    # at the beginning
    def push(self, new_data):
        new_node = Node(new_data)
        new_node.next = self.head
        self.head = new_node
 
# Driver code
ll = LinkedList()
ll.push(5)
ll.push(4)
ll.push(3)
ll.push(2)
ll.push(1)
print ("Given Linked List")
ll.printlist(ll.head)
 
start = ll.rearrangeEvenOdd(ll.head)
 
print ("\nModified Linked List")
ll.printlist(start)
 
# This code is contributed by Prerna Saini


C#
// C# program to rearrange a linked list
// in such a way that all odd positioned
// node are stored before all even positioned nodes
using System;
 
class GfG
{
 
    // Linked List Node
    class Node
    {
        public int data;
        public Node next;
    }
 
    // A utility function to create a new node
    static 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.
    static 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 == 1)
        {
            // If there are no more nodes,
            // then connect first node of even
            // list to the last node of odd list
            if (odd == null || even == null ||
                            (even.next) == null)
            {
                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
    static void printlist(Node node)
    {
        while (node != null)
        {
            Console.Write(node.data + "->");
            node = node.next;
        }
        Console.WriteLine("NULL") ;
    }
 
    // Driver code
    public static void Main()
    {
        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);
 
        Console.WriteLine("Given Linked List");
        printlist(head);
 
        head = rearrangeEvenOdd(head);
 
        Console.WriteLine("Modified Linked List");
        printlist(head);
    }
}
 
/* This code is contributed PrinciRaj1992 */


Javascript


输出:

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



如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程