带头节点的双循环链表的指定反转(完整代码)
程序员文章站
2021-12-23 21:07:12
...
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
struct Node{
int key;
Node *next,*prev;
};
Node *nil;
void init()
{
nil=(Node *)malloc(sizeof(Node));
nil->next=nil;
nil->prev=nil;
}
void printList()
{
Node *cur=nil->next;
int isf=0;
while(1)
{
if(cur==nil) break;
if(isf++>0) printf(" ");
printf("%d",cur->key);
cur=cur->next;
}
printf("\n");
}
void insert(int key)
{
Node *x=(Node *)malloc(sizeof(Node));
x->key=key;
x->prev=nil->prev;
x->next=nil;
x->prev->next=x;
nil->prev=x;
}
int main()
{
int n,i=0,num,j=0;
Node *head;
Node *pre;
init();
cin>>n;
while(cin>>num)
{
insert(num);
}
head=nil->next;
pre=nil;
while(j<=n-1)
{
if(j==0)
{
head->prev=head->next;//头节点的处理
}
if(j==n-1)//搜索到最后一个节点的处理
{
head->prev=nil;
head->next->prev=nil->next;
nil->next->next=head->next;
head->next=pre;
nil->next=head;
}
else//中间节点的处理
{
head->prev=head->next;
head->next=pre;
}
head=head->prev;//俩节点向后搜索
pre=head->prev;
j++;
}
printList();
return 0;
}
用head和pre俩节点向后搜索;
中间节点头尾指针互换其指向;(head->prev=head->next;head->next=pre)
头节点先改变前节点的指向,指向后一节点,放便最后节点的处理;(head->prev=head->next)
最后一个结点处理较为复杂,详情见代码断;
上诉处理后头节点nil指向最后一个节点,最后节点再指向前节点,直到最前面的节点后回到最后节点+1的节点,完成反转;