双链表内部迁移操作

说明:本文仅供学习交流,转载请标明出处,欢迎转载!

所谓双链表的迁移操作指的是将双链表中一部分连续的结点迁移到另外一个结点之前,为了说明这个定义,我们从下图来解释。

我们将[first,last)对应的结点迁移到position所指向的位置之前?那该怎么做呢?这不是一个算法设计题,因为不需要什么特别有效率的技巧,我只是想理清这个思路而已,因为双链表的增删操作如果不理清思路会很容易产生混乱。

下面我们给出该双链表结点的定义:

template<class T>
struct node
{
<span style="white-space:pre">	</span>struct node *pre;
<span style="white-space:pre">	</span>struct node *next;
<span style="white-space:pre">	</span>T data;
};

为了解决该迁移问题而不至于产生混乱,我们将该迁移分为两个过程,一是连接各个断点的next,而是连接各个断点的pre。

连接断点的next

连接断点的pre

最后我们给出函数接口和实现方式之一:

template<class T>
void transfer(node<T> *position,node<T> *first,node<T> *last)
{
	/******先处理各个断点的next,这里先选择最右边的断点*****/
	last->pre->next=position;
	first->pre->next=last;
	position->pre->next=first;
	/******再处理各个断点的pre,这里先选择最左边的断点*****/
	node<T> *temp=position->pre;//先保存第一个设置设置位置的pre
	position->pre=last->pre;//下一步是对last->pre
	last->pre=first->pre;//下一步对first->pre
	first->pre=temp;//这里就显示出为什么要保存temp对应的位置了
}

双链表内部迁移操作

时间: 2024-11-05 20:36:10

双链表内部迁移操作的相关文章

【数据结构】用C++实现双链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

//[数据结构]用C++实现双链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等) //头文件 #ifndef _LIST_H #define _LIST_H #include<iostream> using namespace std; template<class Type> class DList; template<class Type> class ListNode { friend class DList<Type>; public: L

双链表(非循环)相关操作:创建、析构、删除、冒泡排序

struct dulnode { int val; dulnode *pre; dulnode *next; }; //这里创建的不是双循环链表 dulnode* create_dulnode(int n) { if (n <= 0) return NULL; int i = 0; dulnode *head, *p1, *p2; //生成头节点 head = new dulnode; head->val = rand() % RAND_MAX; head->pre = NULL; //

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

数据结构——双链表

双链表的操作 利用链表的尾插法建立双链表: 1 void CreateDlistR(DLNode *&L,int a[],int n){ 2 DLNode *s,*r; 3 int i; 4 L = (DLNode *)malloc(sizeof(DLNode)); 5 L -> prior = NULL; 6 L -> next = NULL; //空的双向链表 7 r = L; //r指向L的头结点也是尾结点 8 for(i = 0;i < n;i++){ 9 s = (DL

有序的双链表的实现

描述 定义有序的双链表类,链表中存储整型数据,创建带头结点的有序双链表,要求包含以下成员函数: 双链表的构造函数(非空的链表,输入数据为0,表示输入结束) 插入操作(将一个数据元素插入到有序的双链表中,插入之后链表仍然有序,输入数据为0表示插入操作结束) 按值删除节点(考虑有重复值的情况) 双链表的遍历操作 双链表的析构 输入输入链表中的元素,根据输入元素,创建有序双链表(非空的链表,输入数据为0,表示输入结束)输入要插入的值(可以插入多个值,0表示输入结束,)输入要删除的值(可以删除多个值,0

双链表操作(转)

双链表的初始化,建立,插入,查找,删除. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 8

JAVA 链表操作:单连表和双链表

主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都相应的应用,链表有多种类别,文章针对单链表和双链表进行分析.链表中数据就像被一个链条串联一起,轻易的可以实现数据的访问. 二.链表实现原理和必要性 这里只分析单链表和双链表.链表的实现过程是有些许复杂的,但是会带来许多好处.比如现在网购时代到来,商家发快递一般会将商品包装在盒子里并写上地址信息,快递

双链表操作

处理完了单链表,这次处理双链表. 在一个双链表中,每个节点都包含两个指针,指向前一个节点的指针和指向后一个节点的指针.这可以使我们以任何方式遍历双链表,甚至可以忽略前后地在双链表中访问.下面的图示展示了一个双链表: 下面是节点类型的声明文件: double_linked_list_node.h #ifndef _DOUBLE_LINKED_LIST #define _DOUBLE_LINKED_LIST typedef struct NODE{ struct NODE * fwd; struct

数据结构--双链表的创建和操作

双向链表的定义 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 注意:在实现的过程中,要分清前驱指针和后继指针,不要把他们当成一个指针. 1 //双向链表的实现 2 template<typename T>struct node{ 3 T data; 4 node<T> *prior,*next; 5 }; 双向链表的实现 1