本題是一個非常經典的題目:單鏈表逆轉。
這是鏈表結點的定義:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存儲結點數據 */
PtrToNode Next; /* 指向下一個結點的指針 */
};
typedef PtrToNode List; /* 定義單鏈表類型 */
先給出實現的代碼:
List Reverse( List L )
{
List before = NULL, head = L, next;
while(head != NULL)
{
next = head->Next; // 記錄當前值的下一個值
head->Next = before; // 修改當前結點的下一個爲上個結點
before = head; // 上一個結點修改爲本結點
head = next; // 當前結點爲下一個結點
}
return before;
};
代碼的思想很簡單,就是我們需要將每個結點的指針改變過來。
當我們從前往後將當前結點的指針指向前一個的時候,我們不可避免的就需要至少三個指針:
- 之前結點的指針
- 當前結點的指針
- 下一個結點的指針
注意在這個過程中,我們如果修改了當前結點指向的下一個結點的位置,那麼我們必然就找不到之前這個結點的下一個結點。
所以我們需要保存下一個結點,以免修改當前結點指向的下一個指針之後找不到下一個結點的位置了。