学习随记六——单链表与双链表交换相邻结点比较

单链表与双链表交换相邻结点比较

单链表结点结构体

typedef struct Listnode1{				//为单链表设置的结点结构体 
	int data;
	struct Listnode1 *next;
}Listnode1;

双链表结点结构体

typedef struct Listnode2{				//为双链表设置的结点结构体 
	int data;
	struct Listnode2* next;
	struct Listnode2* previous;
}Listnode2;

**##***单链表交换相邻结点

  1. 必要操作是需要中间指针保存指向关系,类比用temp来交换两个数
  2. 注意要有个头指针来返回交换后的头地址
Listnode1* change1(Listnode1*p){
	Listnode1 *temp1,*temp2,*head;			//temp1,temp2为中间指针
	head=p->next;			//当通过改变指针指向交换相邻元素时,原第二个结点变为头结点 
	temp1=nullptr;
	while(p->next!=nullptr){
		temp2=p->next;		//保存前一个指针与后一个指针的指向关系
		p->next=temp2->next;//使原第一个结点指向原第三个结点
		temp2->next=p; 		//使原来的后面一个指针指向前一个指针 
		if(temp1!=nullptr)temp1->next=temp2;
		temp1=temp2;
	}
	return head;
}

**##**双链表交换相邻结点

1.链表不能断
2. 双链表交换相邻结点比单链表复杂,有三种情况
3. 此时待交换的前一个结点没有前驱
4. 此时待交换的前一个结点既有前驱,又有后驱,处于中间位置
5. 此时待交换的后一个结点没有后驱
6. 关键要点有三:
(1)、不管有没有前驱和后驱都要进行的操作,有四步

Ⅰ——将待交换的前一个结点的previous指向赋给待交换的后一个结点的previous

Ⅱ——待交换的前一个结点的previous指针指向待交换的后一个结点
Ⅲ——将待交换的后一个结点的next指针指向赋给待交换的前一个结点的next指针
如图:
Ⅳ——使待交换的后一个结点的next指针指向待交换的前一个结点
(2)、特殊情况之一,没有前驱时不进行的操作,
使待交换的前一个结点的previous指针指向的那个结点的next指针指向待交换的后一个结点

	if(p->previous->previous!=nullptr)
		p->previous->previous->next=p->previous;

特殊情况之二,没有后驱时不进行的操作,
使待交换的后一个结点的next指针指向的结点的previous指针指向待交换的前一个结点

if(p->next!=nullptr)
		p->next->previous=p; 

完整代码:

Listnode2* change2(Listnode2*p){
	Listnode2 *head;
	head=p->next;
	while(p->next!=nullptr){
//		p->next=p->next->next;		//使原第一号结点的next指针指向原第三号结点 
//		p->next->previous->next=p->next->previous->previous;	//使原第二号结点的next指针
//		//指向原第一号结点
//		p->next->previous->previous=p->previous;	//将原第一号结点的previous指针的指向关
//		//系传递给原第二号结点的previous指针
//		p->previous=p->next->previous;	//使原第一号结点的previous指针指向原第二号结点
//		if(p->next->next!=nullptr)
//		p->next->previous=p->previous->next;//使原第三号结点的previous指针指向原第一号结点
//		if(p->previous->previous!=nullptr)
//		p->previous->previous->next=p->previous;
		p->next->previous=p->previous;//第一步
		p->previous=p->next;		  //第二步
		p->next=p->next->next;		  //第三步
		p->previous->next=p;		  //第四步
		if(p->previous->previous!=nullptr)  //有前驱做的
		p->previous->previous->next=p->previous;
		if(p->next!=nullptr)		  //有后驱做的
		p->next->previous=p; 
	}
	return head;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值