用于重新排列链表的 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
这个问题的重要一点是确保处理以下所有情况
- 空链表。
- 只有一个节点的链表。
- 只有两个节点的链表。
- 具有奇数个节点的链表。
- 具有偶数个节点的链表。
下面的程序分别为奇数和偶数位置的当前节点维护两个指针“奇数”和“偶数”。我们还存储了偶数链表的第一个节点,以便在所有奇数和偶数节点在两个不同的链表中连接在一起之后,我们可以将偶数链表附加到奇数链表的末尾。
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
请参阅有关重新排列链表的完整文章,以便所有偶数和奇数位置的节点都在一起以获取更多详细信息!