如何实现将一个链表逆序?

如何实现将一个链表逆序?  

2008-07-04 22:19:14|  分类: 程序相关|举报|字号 订阅

  下载LOFTER 我的照片书  |

基本思想:

增加一个辅助指针,以P结点为例 p—>q—>r,我们只需r, q调换下位置就可以了

p=head; 
q=p->next; //
while(q!=NULL) 

temp=q->next; //r
q->next=p;        //q—>r 变成了q—>p
p=q;                 //指针后移
q=temp; 

这样增加个辅助的指针就行乐

ok 通过编译的代码: 
#include  
#include  
#include  

typedef struct List{ 
int data; 
struct List *next; 
}List; 

List *list_create(void) 

struct List *head,*tail,*p; 
int e; 
head=(List *)malloc(sizeof(List)); 
tail=head; 
printf("\nList Create,input numbers(end of 0):"); 
scanf("%d",&e); 
while(e){ 
p=(List *)malloc(sizeof(List)); 
p->data=e; 
tail->next=p; 
tail=p; 
scanf("%d",&e);} 

tail->next=NULL; 
return head; 


List *list_reverse(List *head) 

List *p,*q,*r; 
p=head; 
q=p->next; 
while(q!=NULL) 

r=q->next; 
q->next=p; 
p=q; 
q=r; 


head->next=NULL; 
head=p; 
return head; 


void main(void) 

struct List *head,*p; 
int d; 
head=list_create(); 
printf("\n"); 
for(p=head->next;p;p=p->next) 
printf("--%d--",p->data); 

head=list_reverse(head); 
printf("\n"); 
for(p=head;p->next;p=p->next) 
printf("--%d--",p->data); 
}

进阶:

题目出处:http://blog.rainbud.net/article/entry20050928-014721
给定一单链表的表头指针和指向其中一个节点的指针,要求以该指针为头将原链表逆序排列,例如:
1. N1->N2->N3->N4->N5->NULL pHEAD = N1,pSTART = N3,返回N3->N2->N1->N5->N4->NULL
2. N1->N2->N3->N4->N5->NULL pHEAD = N1,pSTART = N5,返回N5->N4->N3->N2->N1->NULL
3. N1->N2->N3->N4->N5->NULL pHEAD = N1,pSTART = N1,返回N1->N5->N4->N3->N2->NULL

不允许额外分配存储空间,不允许递归,可以使用临时变量。
思路:先将整个链表逆序,然后再从pSTART后面断开,将那部分接到pHead上。

typedef  struct  Node
{
    
int  i;
     Node
*  next;
}
Node,  * PNode;

PNode pHead 
=  NULL;

PNode ListReverse(PNode pHead, PNode pStart)
{
     PNode pNode 
=  NULL, pCur  =  pHead, pNext  =  NULL;
    
while (pCur  !=  NULL)
   
{
         pNext 
=  pCur -> next;
         pCur
-> next  =  pNode;
         pNode 
=  pCur;
         pCur 
=  pNext;
     }

    
     pCur 
=  pNode;
    
if (pCur  ==  pStart)
        
return  pNode;
    
else
{
        
while (pCur -> next  !=  pStart)
             pCur 
=  pCur -> next;
         pCur
-> next  =  NULL;
         pHead
-> next  =  pNode;
        
        
return  pStart;        
     }

}

你可能感兴趣的:(如何实现将一个链表逆序?)