#include <iostream>
using namespace std;
struct ListNode
{
int value;
ListNode* next;
ListNode(int value, ListNode* node) :value(value), next(node)
{
}
};
void traverseList(ListNode* head)
{
while (head != NULL)
{
std::cout << head->value << " ";
head = head->next;
}
std::cout << std::endl;
}
ListNode* oddEventList(ListNode * head)
{
//奇偶链表:
//链表第一个元素是奇数下标位置,然后把链表奇数下标位整合放入偶数下标位的前面
//eg: input 1 2 3 4 5 6 7 output: 1 3 5 7 5 4 6
//解题思路
//分别创捷两个头指针,一个是奇数项组成的奇链表的头oddHead,一个时偶数项组成的偶链表的头eventHead
//对于上例链表,初始化时oddHead指向1,eventHead指向2
//相比odd链表,event的链表元素在odd的前面,所以我们以event链表的头节点进行遍历原链表,然后把遍历
//到的元素和紧跟它的那个奇数项的元素对应插入
//eventHead 和 oddHead组成的链表中
//以event遍历时,只要保证event以及event->next不为空,则表示原链表还没有遍历结束
//因为若是event->next不为空,event的下一个元素的下一个元素必然是存在指向的,这个要放入偶链表链条中,同时
//event后面有一个节点,需要把他放入奇数项链中,
//换一种说法,当event 或者event->next 为NULL时,表示原链表已经遍历完毕,奇偶链表都得到了完整的插入
//比如链表为 1 2 3 ... 5 6 ...7 8 9 10 NULL,event两两步两步走,最后的位置要么是指向10,要么是指向NULL,
//当指向10时,当偶数指向8时,已经把10放入偶链表,9放入奇链表,则此时10已经进入了偶链表,9也进了奇链表,此时直接合并就好
//当指向NULL时,当偶数指向9时,已经把10放入奇链表,9放入偶链表,则此时10已经进入了奇数链表,9也进了偶链表,此时同样直接合并就好
//处理特殊情况
if (head == NULL || head->next == NULL) return head;
//初始化奇偶指针并记录偶指针头位置,用于奇偶链表最后的拼接
ListNode* odd = head;
ListNode* event = head->next;
ListNode* eventHeadBak = head->next;
while (event != NULL && event->next != NULL)
{
//奇偶节点分别插入属于自己的元素节点
odd->next = event->next;
odd = odd->next;
event->next = odd->next;
event = odd->next;
}
//以偶节点的遍历作为的结束条件,且偶链表在前面移动,所以奇链表的最后一个元素不可能是NULL,
//即odd必然不等于NULL,直接可以取next,不必增加判空
//比如链表为 1 2 3 ... 5 6 ...7 8 9 10 NULL,event两两步两步走,最后的位置要么是指向10,要么是指向NULL,
//此时对应的奇链表最后一个元素要么是指向9,要么是指向10
odd->next = eventHeadBak;
return head;
}
int main()
{
ListNode* node1 = new ListNode(1, NULL);
ListNode* node2 = new ListNode(2, NULL);
ListNode* node3 = new ListNode(3, NULL);
ListNode* node4 = new ListNode(4, NULL);
ListNode* node5 = new ListNode(5, NULL);
ListNode* node6 = new ListNode(6, NULL);
ListNode* node7 = new ListNode(7, NULL);
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node5;
node5->next = node6;
node6->next = node7;
traverseList(node1);
ListNode* newListHead = oddEventList(node1);
traverseList(node1);
}
奇偶 链表
于 2022-03-20 16:44:26 首次发布
该博客主要讨论如何实现一个C++函数,该函数接收一个链表作为输入,并按照奇偶链表的规则重新排列链表。奇偶链表是指链表的奇数下标位置的元素被整合到偶数下标位置的前面。博主提供了详细的解题思路和代码实现,通过创建奇链表和偶链表,然后将它们合并,最终输出重新排列后的链表。
摘要由CSDN通过智能技术生成