標籤:ext 資料 問題 演算法 表 代碼
關於單向鏈表的反轉想必大家都很熟了,以前一直用遞迴的方法寫的,還是挺好寫的,但是後來又在網上瞄了一眼非遞迴方法的實現,當時以為那個代碼是正確的,也沒驗證,後來就不了了之。
昨天下午開始寫這個代碼,最後老發現出問題,今天早上起來理了一遍,終於發現癥結所在。
舉個例子吧:
1->2->3->4->5->6 我反轉後的結果應該是: 6->5->4->3->2->1
我的演算法是這樣的(語死早,大家不要笑,我就用過程圖表達吧):
1->2->3->4->5->6
2->1->3->4->5->6
3->2->1->4->5->6
4->3->2->1->5->6
5->4->3->2->1->6
6->5->4->3->2->1
其實整個過程不複雜,但是吧,之前一直沒把圖畫出來,理所當然的在空想,我把我的感觸寫下來吧:
1:注意1這個位置,這個位置起著串連後面未操作的資料的作用,相當重要,這是我之前代碼一直出問題的原因
2:注意每次頭結點的變化
3:到最後的時候尾節點變成了1位置的節點
好了,放代碼了,新手寫代碼,大家請多多指教O(∩_∩)O哈!
struct Node // 結點結構
{
int m_data;
Node* m_next;
};
struct List // 單向鏈表結構
{
Node* m_head;
Node* m_tail;
size_t m_length;
};
// 單向鏈表反轉
Node* first = m_head; // 兩個待交換結點的第一個結點
Node* second = m_head->m_next; // 兩個待交換結點的第二個結點
Node* next = second->m_next; // 下一個要交換的節點
Node* last = m_head; // 存放上面的“1”對應的節點
//以下是第一次交換,是第一個結點和第二個結點的交換
second->m_next = first; // 後面的節點改變指向指向前面的節點
first->m_next = next; // 前面的節點改變指向,指向下一個要交換的節點
first = second; // 這一行和下一行做的操作就是把後面的節點和下一個要交換的節點放到first和second中用來操作
second = next;
next = next->m_next; //下下個要交換的節點
while(second != NULL)
{
second->m_next = first; // 同上面的注釋
last->m_next = next; //這一塊就比較坑啦,大家要注意看我上面的圖中1所在的位置,是1在不停地往後走,first對應的資料其實它的後結點是不會變了
first = second; // 上面已經有注釋
second = next;
if (next != NULL)
{
next = next->m_next;
}
}
m_head = first;
m_tail = last;
哎,我這表達能力啊,太捉急了,不過總算是寫完了。。。謝謝大家捧場。