/************************************************************************/
/*@author lynnbest
问题3:单链表的就地逆置
*/
/************************************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}listnode;
int length(listnode *head);
void InsertListNode(listnode *head,int pos,int data);
void printflist(listnode *head);
void InverseListNode(listnode *head); //单链表的就地逆置
void main()
{
printf(" 单链表的就地逆置 \n");
printf("----by lynnbest ----\n\n");
int a[]={1,2,3,4,5,6,7,8,9,10,11};
int len=sizeof(a)/sizeof(a[0]);
listnode *head=(listnode *)malloc(sizeof(listnode));//创建头结点
if(NULL==head)
{
printf("head malloc创建失败\n");
exit(-1);
}
head->next=NULL;
for(int i=0;i<len;i++)
InsertListNode(head,i+1,a[i]);
printf("就地逆置前为:\n");
printflist(head);
InverseListNode(head);
printf("就地逆置后为:\n");
printflist(head);
}
void InsertListNode(listnode *head,int pos,int data)
{
if(pos<1||pos>length(head)+1)
{
printf("插入位置错误\n");
return;
}
listnode *pre=head,*q; //pre 先驱指针 q新开辟的节点
if(NULL==(q=(listnode *)malloc(sizeof(listnode))))
{
printf("malloc分配失败\n");
exit(-1);
}
q->data=data;
q->next=NULL;
for(int i=1;i<pos;i++)
pre=pre->next;
q->next=pre->next; //先更新新节点next
pre->next=q; //在更新pre next
}
int length(listnode *head)
{
listnode *p=head->next;
int count=0;
while(p!=NULL)
{
count++;
p=p->next;
}
return count;
}
void printflist(listnode *head)
{
//printf("当前链表元素为:\n");
listnode *p=head->next;
while(p!=NULL)
{
printf("%3d",p->data);
p=p->next;
}
printf("\n");
}
void InverseListNode(listnode *head)
{
/* listnode *pre=NULL,*p=head->next,*s;//pre指向头结点,p指向第一个元素
while(p!=NULL)
{
s=p->next; //s为待逆置节点
head->next=p; //p为当前要逆置的点
p->next=pre; //将当前指针 指向前一个节点
pre=p; //pre 更新
p=s; //p更新
}
*/
/************************************************************************/
/*思路:
1.先把头结点next NULL
2.然后保存带逆置点
3.先将逆置的点的next域指向前一个 head->next
4.在更新 head->next
5. 更新p=q;
*/
/************************************************************************/
listnode *p=head->next,*q;
head->next=NULL;
while(p)
{
q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
}
实战数据结构(8)_单链表的就地逆置
最新推荐文章于 2023-10-13 20:30:00 发布