单链表与双链表交换相邻结点比较
单链表结点结构体
typedef struct Listnode1{ //为单链表设置的结点结构体
int data;
struct Listnode1 *next;
}Listnode1;
双链表结点结构体
typedef struct Listnode2{ //为双链表设置的结点结构体
int data;
struct Listnode2* next;
struct Listnode2* previous;
}Listnode2;
**##***单链表交换相邻结点
- 必要操作是需要中间指针保存指向关系,类比用temp来交换两个数
- 注意要有个头指针来返回交换后的头地址
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;
}