需要三個指標,前驅p1,當前p2,後繼p3
結束的條件是p2==null
void reverse1(pnode &head)p1=p2;
p2=p3;
}head->next=p1;
}
//head變成新頭節點返回
else
return;}
pnode reverse1(pnode head)加深理解:p1=p2;
p2=p3;
}return
p1; }
//head變成新頭節點返回
else
return
head;
}
不會出現上面的環,並且head和p1都不會改變,只需要改變p2,p3即可。
void reverse2(pnode &head)加深理解:}
else
return;}
採用遞迴的方式,如果要將當前結點逆序,那麼先將它的後繼結點都逆序,然後把逆序後的尾結點的next指向當前結點即可,要注意的是遞迴出口,我們選擇鍊錶為空或者只有乙個結點的情況為遞迴出口。
第一次遞迴呼叫:
頭節點head的下乙個節點head->next將是逆序後的新鍊錶的尾節點,也就是說,被摘除的頭接點head需要被連線到head->next才能完成整個鍊錶的逆序
第二次遞迴:
再進行一次遞迴:
遞迴終止條件就是鍊錶只剩乙個節點時直接返回這個節點的指標。可以看出這個演算法的核心其實是在回朔部分,遞迴的目的是遍歷到鍊錶的尾節點,然後通過逐級回朔將節點的next指標翻轉過來。
pnode reverse3_no_head(pnode head)else
}
void reverse3_with_head(pnode &head)加深理解:pnode newhead =reverse3_no_head(head->next); //結合不帶頭結點的遞迴
head->next =newhead;
}
#includeusingnamespace
std;
typedef
struct
nodenode,*pnode;
void inithead(pnode &head)
void bulidhead(pnode &head)
}void
printhead(pnode head)
}void destroyhead(pnode &head)
}pnode reverse(pnode head)
void reverse1(pnode &head)
p1=p2;
p2=p3;
}head->next=p1;
}
//head變成新頭節點返回
else
return;}
void reverse2(pnode &head)
}
else
return;}
pnode reverse3_no_head(pnode head)
else
}void reverse3_with_head(pnode &head)
//pnode firstnode = head->next;
pnode newhead = reverse3_no_head(head->next);
head->next =newhead;
}int
main()
單鏈表逆序(三種方式)
三種方式實現單鏈表的逆序,分別是頭結點插入,對稱交換和利用堆疊來實現。三種方式分別是出於空間和時間的考慮來實現的,詳見注釋。public class linkedlist public node object data,node next public node getnext public voi...
單鏈表實現反轉的三種方法
單鏈表的操作是面試中經常會遇到的問題,今天總結一下反轉的幾種方案 1 兩兩對換 2,放入陣列,倒置陣列 3,遞迴實現 如下 include include typedef struct node node,pnode pnode createnode phead pnext null int n p...
c 逆序的三種方法
include using namespace std include int main for int i 0 i len i 方法2 char p input len 1 for int i 0 i len i cout endl 方法三 for int i 0 i len i system p...