常用演算法題目總結三(鍊錶篇)

2021-08-03 23:39:03 字數 3200 閱讀 8040

只遍歷一次鍊錶時如何實現呢?

**示例:

templatestruct node		//鍊錶節點

;

template

void

printlist

(node

* head)

//列印鍊錶

cout << endl;

}

templatenode* constructlist(int n)//構造鍊錶

return head;

}

templatenode* findpos(node* head, int k)//查詢函式

while (ptr1 != null)

return ptr2;

}

int main()

思路:利用棧實現單鏈表反轉。

templatenode* converselist(node* head)   //鍊錶反轉

node* new_head = m_stack.top(); //新的煉表頭

node* tmp = new_head;

m_stack.pop();

while (!m_stack.empty())

tmp->next = null; //尾節點

return new_head;

}

int main()

思路:也可以向上面的思路一樣,用棧去解決,但是需要維護乙個額外的棧空間。延伸一下,遞迴本質上就是乙個棧結構。想到了用遞迴實現。

**如下:

template

void

printconverselist

(node

* head)

}

int

main()

思路:採用遍歷2遍鍊錶的方法,問題就無意義了,大家都能很容易就想到了,應思考遍歷1遍的方法。我的思路是採用兩個指標,都從頭開始,乙個指標步長是1,另乙個指標步長是2,當步長為2的指標到尾節點時,步長為1的指標剛好到鍊錶中間節點。(因為指標1遍歷的長度是指標2遍歷的長度的一半)

**示例:

template

node

*findhalfpos

(node

* head)

}return ptr1;

}

int

main()

排序方法有很多,下面是較簡單的氣泡排序,注意,快速排序不能再單鏈表中使用。

**實現如下:

template

void

bubblesortlist

(node

* head)}}

}

**實現如下:

template

node

*constructlooplist

(t* a,

int n)

//構造帶環的鍊錶

node->data = a[i]

; node->next =

null

; tmp->next = node;

tmp = node;

} tmp->next=loop;

//尾節點指向鍊錶中的某個節點,如果指向的是煉表頭,就變成迴圈鍊錶了。

return head;

}

template

bool islooplist

(node

* head)

//如果到鍊錶尾也沒有重複訪問的鍊錶位址,則不是帶環鍊錶

return false;

}

int

_tmain

(int argc, _tchar* argv)

; node<

int>

* head=constructlooplist<

int>

(a,6);

cout

(head)

;system

("pause");

return0;

}

想到了2種方法,一種是遞迴實現,一種是非遞迴實現,都比較好理解,直接上**如下。

**如下:

//如何合併兩個有序鍊錶(非交叉)

#include

#include

#include

#include

using namespace std;

template

struct node

node

(const t& e,node* p=

null):

data

(e),

next

(p) t data;

node* next;

};

//遞迴實現

template

node

*mergerecursive

(node

* head1,node

* head2)

else

return head;

}

//非遞迴實現

template

node

*mergelist

(node

* head1,node

* head2)

else

node

* p=head;

while

(head1!=

null

&&head2!=

null

)else}if

(head1!=

null)if

(head2!=

null

)return head;

}

常用演算法題目總結一(陣列篇)

一 如何用遞迴實現陣列求和?include stdafx.h include include using namespace std template t getsum t a,int n return getsum a,n 1 a n 1 int tmain int argc,tchar argv...

鍊錶演算法題目彙總

已知乙個帶有表頭結點的單鏈表,結點結構為 data link 假設該鍊錶只給出了頭指標list,在不改變鍊錶前提下,請設計乙個盡可能高效的演算法,查詢鍊錶中導數第k個位置上的結點 k為正整數 若查詢成功,演算法輸出為該節點的data域的值,並返回1,否則,只返回0.要求 描述演算法的基本設計思想 描...

演算法 鍊錶常用演算法

常見演算法 1.鍊錶逆序 2.鍊錶求交點 3.鍊錶求環 4.鍊錶劃分 5.複雜鍊錶的複製 6 a.2個排序鍊錶歸併 6 b.k個排序鍊錶歸併 鍊錶定義 definition for singly linked list.struct listnode 1.鍊錶逆序 classsolution ret...