算法学习:重新排序链表

栏目: 数据库 · 发布时间: 7年前

内容简介:给定一个单链表,将链表按头节点、尾节点、第二个节点、 倒数第二个节点…的规律重建。要求:原地操作,不改变节点的值。暴力法:先找头节点,再找尾节点,然后顺次第二个节点,倒数第二个节点,由于是单链表,不停的从表头遍历到表尾,时间复杂度O(n^2)

算法学习:重新 <a href='https://www.codercto.com/topics/21904.html'>排序</a> 链表

给定一个单链表,将链表按头节点、尾节点、第二个节点、 倒数第二个节点…的规律重建。要求:原地操作,不改变节点的值。

思路

暴力法:先找头节点,再找尾节点,然后顺次第二个节点,倒数第二个节点,由于是单链表,不停的从表头遍历到表尾,时间复杂度O(n^2)

看下有没有其他便捷方法。

假设给一组数字 1,2,3,4,5,6 ,重新排序后是 1,6,2,5,3,4 ,会发现一个规律, 1, 2, 3 是顺序的, 6, 5, 4 是倒序插入的。

所以可这样考虑:

先把链表一分为二,把后半部分数据倒序插入前半部分。

头插法制作倒序链表,时间复杂度 O(n),将左右两链表合并,时间复杂度 O(n)。总时间复杂度为O(n)。

伪代码

void Revert (Link L1) {
	new Link L2; //用于存放倒序的后半部链表
	int half_len = L1.lenght() / 2; //记录链表的一半
	int*p = L1->head; //p 指向 L1 头节点
	int*q = L2->head; //q 指向 L2 头指针
	int *s, *t;

	for (int i = 0; i < half_len; i++) {
		s= s->next; // 找到链表中部
	}

	q= s->next; //把后半段链表赋值给 L2
	s->next = null; // 此时 s 为 L1尾指针

	t= q->next;
	// 这里我直接在表内操作,看起来有点乱,新建个 L3来存放会看得舒服点
	while( t->next != null ) { //倒置 L2
		q->next= t->next;
		t->next = q;
		L2->head->next = t;
		t= q->next;
		q= L2->head->next;
	}

	while ( p != s ) { // p 没有走到表尾时插入L2节点
		t= L2->head->next; //一开始,t 指向 L2第一个节点
		L2->head->next= L2->head->next->next; //取出第一个节点,第二个节点变成第一个节点
		t->next= p->next; //t 插入 p
		p->next= t->next;
		p= p->next->next; //移动 p 到下一个待插入的节点
	}

}

简单的图示:

算法学习:重新排序链表


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

首席产品官2 从白领到金领

首席产品官2 从白领到金领

车马 / 机械工业出版社 / 79元

《首席产品官》共2册,旨在为产品新人成长为产品行家,产品白领成长为产品金领,最后成长为首席产品官(CPO)提供产品认知、能力体系、成长方法三个维度的全方位指导。 作者在互联网领域从业近20年,是中国早期的互联网产品经理,曾是周鸿祎旗下“3721”的产品经理,担任CPO和CEO多年。作者将自己多年来的产品经验体系化,锤炼出了“产品人的能力杠铃模型”(简称“杠铃模型”),简洁、直观、兼容性好、实......一起来看看 《首席产品官2 从白领到金领》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码