單鏈表逆序三種方法

2022-06-27 01:03:19 字數 2702 閱讀 2796

需要三個指標,前驅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;

}

加深理解:

#includeusing

namespace

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...