只遍歷一次鍊錶時如何實現呢?
**示例:
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...