單鏈表遞迴和非遞迴兩種翻轉方法(手寫鍊錶)

2021-07-24 00:18:11 字數 2546 閱讀 6095

一.對稱翻轉的思想

首先最直接的翻轉就是對稱翻轉,以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...