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

单链表——逆序

单链表逆序以及将后半部分结点逆序

#include 
#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;ix=i;
		p->next=temp;
		p=temp;
	}
	p->next=NULL;
	
	return head;

}

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

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

	cout<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;inext;

	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;
} 


你可能感兴趣的:(数据结构)