【摘要】鍊錶逆轉是面試環境中經常遇到的一道題目,也是我們在實際開發中可能會遇到的開發需求。和線性逆轉不一樣,單向鍊錶的節點需要乙個乙個進行處理。有需要的朋友可以看一下,如果有沒考慮周全的地方歡迎指正。
為了顯示兩者之間的區別,我們分別對線性記憶體和鍊錶進行逆**
status normal_revert(int array, int
length)
memmove(array, pdata, length * sizeof(int));
free(pdata);//防止記憶體洩露
pdata = null;
return true;
}
分析:我們看到連續記憶體反轉函式主要做了下面幾個工作:
1)分配和原來資料一樣大的記憶體
2)從原來資料末尾開始拷貝
3)利用pdata獲取的資料對原來的資料進行拷貝覆蓋,釋放記憶體
/*單鏈表資料結構*/
typedef
struct lnode
lnode, *linkedlist;
① 第一種方法
/*不帶頭結點的鍊錶反轉*/
linkedlist reversesinglylinkedlist(linkedlist list)
newlist->
data
=list
->
data;//原始鍊錶的第乙個結點
newlist->next =
null;
while (list
->next !=
null)
free(list);
return newlist;
}
② 第二種方法
不帶頭結點的反轉函式,該函式採用三個結構體指標分別儲存 前一節點 當前節點 後一節點 的值,將當前節點的指標域值直接指向前一節點,後一節點作為鍊錶後面的引線,再將這三個指標往後移一位,遞迴進行前面的動作
/*無頭結點*/
linkedlist reverse(linkedlist head)
head->next =
null;//將原來的第乙個節點的指標域賦為空,作為尾節點
head = pre; //將原來的尾節點變成新鍊錶的第乙個節點
return head;
}
帶頭結點的反轉函式,該函式採用三個結構體指標分別儲存 前一節點 當前節點 後一節點 的值,將當前節點的指標域值直接指向前一節點,後一節點作為鍊錶後面的引線,再將這三個指標往後移一位,遞迴進行前面的動作;因為此煉表為帶頭結點的鍊錶,頭結點的資料域並沒有存放有效的資料,此函式與上一函式的區別是,需要保持頭結點不動,只需要反轉後面存有效資料的結點部分
/*有頭結點*/
linkedlist reverse(linkedlist head)
head->next->next=
null;//將原來的第乙個節點的指標域賦為空,作為尾節點
head->next = pre; //將原來的尾節點變成新鍊錶的第乙個節點(頭結點所指向的節點)
return head;
}
演算法學習 反轉鍊錶
輸入乙個鍊錶的頭結點,將這個鍊錶反轉並輸出它的新的頭結點 public class listnode 方法一 public class solution h1.next null return head 方法二 其實我寫的這兩個差不多,為什麼要寫相似的兩個?因為我要學習區別使用p和p.next的區別...
演算法學習之路 反轉鍊錶
給定乙個常數k以及乙個單鏈表l,請編寫程式將l中每k個結點反轉。例如 給定l為1 2 3 4 5 6,k為3,則輸出應該為3 2 1 6 5 4 如果k為4,則輸出應該為4 3 2 1 5 6,即最後不到k個元素不反轉。輸入格式 每個輸入包含1個測試用例。每個測試用例第1行給出第1個結點的位址 結點...
演算法之反轉鍊錶
問題很簡單 反轉乙個鍊錶。其實就是對鍊錶的基礎操作,思路是順著煉表頭結點的next指標遍歷整個鍊錶。假設鍊錶前三個節點分別為a b c。1.a next c 2.b next a 以a的next節點作為判斷依據即可遍歷整個鍊錶並實現前後兩個節點的指標反轉。雖然思路很簡單,但寫的時候發現c的快忘得差不...