【总结】逆置双向链表的三种方法

双向链表的遍历要比单向链表方便很多,所以逆置方法要比单链表丰富很多,因为可以从后向前遍历,所以可以像逆置数组一样进行操作,也可以根据单链表的特性进行逆置,也可以用双链表独有的特性进行逆置。具体方法如下:

链表的类定义如下:

typedef int DataType;
class DSNode
{
public:
	friend class DNSList;
	DSNode(DataType x=0)
		:_data(x),
		_next(NULL),
		_prev(NULL)
	{

	}
private:

	DSNode*_prev;
	DSNode*_next;
	DataType _data;

};
class DNSList
{
public:
	DNSList()
		:_head(NULL),
		_tail(NULL)
	{

	}
	~DNSList()
	{
		_Clear();
	}
	DNSList(const DNSList &l)
	{
		DSNode *cur = l._head;
		while (cur)
		{
			PushBack(cur->_data);
		}
	}
	DNSList operator = (DNSList l)
	{
		_Clear();
		DSNode *cur = l._head;
		while (cur)
		{
			PushBack(cur->_data);
		}
	}
public:
	// 头插/头删/尾插/尾删
	void PushBack(const DataType& x);
	void PopBack();
	void PushFront(const DataType& x);
	void PopFront();

	// 插入/查找/删除
	void Insert(DSNode* pos, const DataType& x);
	DSNode* Find(const DataType& x);
	void Erase(const DataType& x);
	//void Reverse();//同一空间复杂度不需要返回值
	DNSList* Reverse();//不同空间复杂度通过链表指针返回

	// 打印
	void Print();

private:
	void _Clear()
	{
		while (_head)
		{
			DSNode*cur = _head;
			_head = _head->_next;
			delete cur;
		}
	}
	DSNode *_head;
	DSNode *_tail;
};

在单一空间复杂度下:

1.通过头尾指针向中间遍历,交换所存储的内容。

void DNSList::Reverse()
{
	DSNode *begin = _head;
	DSNode *end = _tail;
	while (!(begin==end||begin->_prev==end))
	{
		DataType tmp = begin->_data;
		begin->_data = end->_data;
		end->_data = tmp;
		end = end->_prev;
		begin = begin->_next;
	}
}

2.单纯通过头指针向后遍历,交换每个节点的前驱与后继。

void DNSList::Reverse()
{
	std::swap(_head, _tail);
	DSNode*cur = _head;
	while (cur)
	{
		std::swap(cur->_next, cur->_prev);
		cur = cur->_next;
	}
}

在多重空间复杂度下:

创建新的双向链表指针,将目标链表从前向后遍历/从后向前遍历,把每个节点的元素进行头插/尾插。

DNSList* DNSList::Reverse()
{
	DNSList*NewList = new DNSList;
	DSNode *cur = _head;
	while (cur)
	{
		NewList->PushFront(cur->_data);
		cur = cur->_next;
	}
	return NewList;
}

如有不足或错误,希望批评指正。

时间: 2024-08-14 03:32:42

【总结】逆置双向链表的三种方法的相关文章

【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)

建立源文件List.cpp include "List.h" int main() {     Test();     system("pause");     return 0; } 建立头文件List.h #ifndef __LISH_H__ #define __LISH_H__ #include<iostream> using namespace std; typedef int DataType; struct ListNode {     Li

Logstash处理json格式日志文件的三种方法

假设日志文件中的每一行记录格式为json的,如: {"Method":"JSAPI.JSTicket","Message":"JSTicket:kgt8ON7yVITDhtdwci0qeZg4L-Dj1O5WF42Nog47n_0aGF4WPJDIF2UA9MeS8GzLe6MPjyp2WlzvsL0nlvkohw","CreateTime":"2015/10/13 9:39:59",&

Action访问Servlet API的三种方法

一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器而言,不访问action是不行的,Struts提供了一种比较简单的方式来访问Servlet API . 二.通常我们需要访问的Servlet API 是 HttpSession.HttpservletRequest.ServletContext,分别对应了JSP内置对象 session,reques

Spring使用jdbcJdbcTemplate和三种方法配置数据源

三种方法配置数据源 1.需要引入jar包:spring-jdbc-4.3.2.RELEASE.jar <!-- spring内置,springJdbc,配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"

RHEL7.0 配置网络IP的三种方法

导读 RHEL7里面的网卡命名方式从eth0,1,2的方式变成了enoXXXXX的格式. en代表的是enthernet (以太网),o 代表的是onboard (内置),那一串数字是主板的某种索引编号自动生成,以便保证其唯一性.和原先的命名方式对比,这种新的方式比较长,难以记忆,不过优点在于编号唯一,做系统迁移的时候不容易出错. 1.修改/etc/sysconfig/network-scripts/eno16777736 查看你的网卡名称(本机是eno16777736): [[email pr

linux中传文件的三种方法、windows

第一种方法:使用vsftpd服务 ftp配置文件主要内容:[[email protected] vsftpd]# cat vsftpd.conf|grep -v ^#|grep -v ^$anonymous_enable=YES #匿名登陆local_enable=YES #允许使用本地用户来登陆ftplocal_root=/var/ftp/pub #write_enable=YES #开放本地用户写的权限local_umask=022 #FTP上本地的文件权限,默认是077 anon_uplo

分区自动挂载的三种方法

一.修改/etc/rc.local配置文件追加类似命令:mount /dev/sda1  /sda1 到配置文件最后一行 二,修改/etc/fstab配置文件追加类似命令:/dev/sda1   /sda1  ext4   defaults   0  0 到配置文件中 三,安装autofs服务yum install autofs 追加类似命令:sda1   -fstype=ext4  :/dev/sda1 到配置/etc/autofs.misc文件中重启服务: service autofs re

VMWARE虚拟机不能上网三种方法分析

bridged(桥接模式). NAT(网络地址转换模式) host-only(主机模式). 理论理解: 1.bridged(桥接模式) 在这处模式下,虚拟机等同于网络内的一台物理主机,可对手动设置IP,子网掩码,DNS,且IP地址要和主机的IP在同一网段内.这样,虚拟机就和主机如同连在一个HUB上的两台计算机,只要主机能上网,虚拟机也会在这种模式下上网. 2.host-only(主机模式) 在host-only模式中,所有的虚拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开的. 提示:在

pdf文件怎么编辑 如何编辑pdf文件的三种方法

pdf文件越来越流行,工作中经常遇到需要修改pdf文件的情况.一般人的电脑上都为pdf文件安装了一个pdf阅读器,可它只能用来阅读查看pdf文件,并不能满足人们的编辑需求.那么pdf文件怎么编辑?下面小编给大家讲讲关于如何编辑pdf文件的三种方法.     方法一:直接编辑,一步到位     如果要对pdf文件进行编辑,我们则需要安装pdf编辑器.最新版的迅捷pdf编辑器可以编辑pdf文件中的任何内容,包括文字.图片.页眉页脚.添加注释等等.迅捷pdf编辑器如何编辑pdf文件?     首先需要