这个题目是一个函数题,只需要写一个函数Reverse就行
但是通过搜索资料,发现单链表逆转可以用四种方法来实现
1、迭代逆转链表
借助三个指针beg,mid,end来遍历该链表,在这个过程中,把指针域的指针都改变方向,最后将给出的头指针L指向最后一个即可
List Reverse(List L ){
if(L == NULL){
return L ;
}
if(L->next == NULL){
return L ;
}
int flag = 0 ;
List beg ,mid ,endd ;
beg = NULL ;
mid = L ;
endd = L->Next ;
do{
mid->Next = beg
if(flag == 1){
break ;
}
beg = mid ;
mid = endd ;
endd = endd->Next ;
if(endd == NULL){
flag = 1 ;
}
}while(1) ;
L = mid ;
return L ;
}
2、递归逆转链表
递归的思想一般来说都有点难懂,但是这个相当于套娃,一层一层翻出来,就相当于从链表的最后端到最前端走了一遍。
List Reverse(List L ){
if(L == NULL){
return L ;
}
if(L->Next == NULL){
return L ;
}
List NL = Reverse(L->Next);
L->Next->Next = L ;
L->Next = NULL ;
return NL ;
}
3、头接法逆转链表
相当于以原链表的元素作为原材料,用头接法的方式在创建一个新的链表,根据头接法的特点,新的链表就与原链表相逆了
List Reverse( List L ){
if(L == NULL){
return L ;
}
if(L->Next == NULL){
return L ;
}
List NewL = NULL ;
List p = NULL ;
while(L != NULL){
p = L ;
L = L->Next ; //必须写在这里,若写在最后L->Next会变成NewL
p->Next = NewL ;
NewL = p ;
}
return NewL ;
}
4、就地逆置链表
就地逆置链表顾名思义就是不创建新链表,直接对原链表进行逆转,需要借助到两个指针,beg和end,初始将beg指向首个结点,end指向beg的第二个结点,将end的Next指向L指向的结点,然后将L指向end,beg的Next指向end的下一个结点
List Reverse( List L ){
if(L == NULL){
return L ;
}
if(L->Next == NULL){
return L ;
}
List beg = L ;
List endd = beg->Next ;
while(endd != NULL){
beg->Next = endd->Next ;
endd->Next = L ;
L = endd ;
endd = beg->Next ;
}
return L ;
}
第二种方法不适用于(并非不行)带有头结点的链表,第一三四中方法皆可处理带有头结点的链表。
具体详情请看:单链表反转详解(4种算法实现)