奇偶 链表

#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);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值