一.對稱翻轉的思想
首先最直接的翻轉就是對稱翻轉,以1為對稱軸,把後面的數字依次插入最前邊形成翻轉
1 2 3 4 5
2 1 3 4 5
3 2 1 4 5
4 3 2 1 5
5 4 3 2 1
current 指標指向1
pnext 指標指向2
ptr 指標指向3
以1為對稱軸,即用current指標一直指向1,每做一次迴圈,pnext所指的數字都移動到鍊錶附加頭的後面,然後pnext和ptr向右偏移一位(current
不變),
每次迴圈的先決條件是pnext
存在(ptr為空表示pnext為鍊錶的最後一位)
那麼可以有下面的偽**
(1)初始狀態:(初始化)
current一直指向1,//1
的位址可以從初始狀態時
head->next
得到;
pnext 等於current所指的下乙個節點;
ptr 等於pnext所指的下乙個節點;
(2)迴圈的先決條件是(pnext存在):
迴圈內部是:
1.1把current後的元素即pnext插到附加頭的後面;
1.2把pnext和ptr都向右移一位(即以
current
為參考點重新賦值);
【小技巧】
#includeusing namespace std;
//鍊錶節點結構體
struct linknode
linknode(constint&item, linknode *p = null)
};//建立鍊錶
class list
void input(int); //建立鍊錶節點
void output();
void reversal(); //翻轉
linknode*reversalist(linknode*); //翻轉(遞迴)
linknode* getfirstnode();
private:
linknode *first, *last;
}; void list::input(int a)
last->link = newnode;
last = newnode; }
void list::output()
}//反轉鍊錶(非遞迴)
void list::reversal()
}//反轉鍊錶(遞迴)
linknode*list::reversalist(linknode* firstnode) }
linknode*list::getfirstnode()
void main()
1.遞迴翻轉單鏈表的演算法的總結:
linknode*list::reversalist(linknode* firstnode)
if (null == firstnode ||null == firstnode->link)
return firstnode;
else
linknode* newhead =reversalist(firstnode->link); //-----------------1
firstnode->link->link= firstnode; //重要的翻轉操作
--2
firstnode->link = null;
//first->link =newhead;
// ----------------------------3
return newhead;
(1)首先這種遞迴方法只關心結點指標
函式的引數中輸入的節點指標就是要翻轉的單鏈表的首節點指標,
遞迴思想:
每次遞迴要完成的操作是:把當前引數所指向的結點的pnext成員指向上乙個結點,修改鍊錶方向,完成鍊錶方向的翻轉
重要延伸:
這種遞迴翻轉可以翻轉以任意位置開始的後面的單鏈表
1->2->3->4->5->6->7->8->9->10
假如結點 3 的指標是 node3,reversalist(node3)表示從結點3開始翻轉其後的鍊錶,此時
1->2->
3<-4<-5<-6<-7<-8<-9<-10
reversalist(node3)返回的值是翻轉後的鍊錶的首節點
1->2->此時要指向翻轉後的鍊錶的首節點來連成乙個完整的鍊錶,標註
3就是完成這部操作的。
有序單鏈表的合併 遞迴和非遞迴方法
已知有兩個有序的單鏈表head1和head2。分別使用遞迴方法和非遞迴的方法合併成乙個有序的單鏈表。1 遞迴方法。假設兩個鍊錶 1 3 5 2 4 6.遞迴的步驟如下 1 比較鍊錶一和鍊錶2的第乙個資料節點,由於1 2,因此將結果鍊錶中的表頭節點指向鍊錶1中的第乙個節點,即資料1所在節點。2 對剩餘...
單鏈表反轉(遞迴和非遞迴)
單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 cpp view plain copy typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟...
單鏈表反轉(遞迴和非遞迴)
單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟2 其中注意,鍊錶是以節點後繼為null...