您的位置:首页 > 理论基础 > 数据结构算法

数据结构——20 单链表逆序

2016-09-09 16:06 204 查看
单链表——逆序
单链表逆序以及将后半部分结点逆序

#include <iostream>
#define SIZE 100
using namespace std;
struct node
{
int x;
node* next;
};

node* create(int n)    //建立链表
{
node *head=new(node);
node *p=head;
for(int i=0;i<n;i++)
{
node *temp=new node;
temp->x=i;
p->next=temp;
p=temp;
}
p->next=NULL;

return head;

}

void display(node *head)    //打印链表
{

node *p=head->next;
while(p)
{
cout<<p->x<<" ";
p=p->next;
}

cout<<endl;

}

node* invert(node* head)     //链表逆序
{
//node *tail=head->next;   //第一个节点变为最后一个节点后,它没有下一个结点,指向NULL
node* p=head->next;        //p指向第一个结点
node* temp=p->next;        //temp指向第二个结点
node*s;

while(temp)
{
s=temp->next;
temp->next=p;
p=temp;
temp=s;
}

head->next->next=NULL;     //此时head还是指向第一个结点的,所以逆序后,让第一个结点指向为NULL
head->next=p;              //重新让head指向逆序后的第一个结点
return head;
}

void invertN(node* head,int n)     //链表前n个顺序不变,后面的结点逆序
{
node* p=head->next;
for(int i=0;i<n-1;i++)       //p指向需要逆序的开始结点之前那个结点
p=p->next;

node* q=p;                 //保存第一个逆序结点之前的那个结点,逆序后,它的下一个结点为NULL

node* temp=p->next;        //开始逆序
node*s;
while(temp)
{
s=temp->next;
temp->next=p;
p=temp;
temp=s;
}

q->next->next=NULL;        //逆序部分的最后一个结点指向为NULL,即刚才保存的那个q结点之后的结点

q->next=p;                 //逆序后,将链表链接起来

}
int main()
{
int n=10;
node *head=create(10);
display(head);

node *head1=invert(head);      //逆序链表
display(head1);

invertN(head,4);               //逆序后面部分结点
display(head);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: