試題1.在一個長度為n的.順序儲存線性表中,向第i個元素(1≤i≤n+1)之前插入一個新元素,需要從後往前依次後移幾個元素?刪除第i個元素時,需要從前向後前移幾個元素?
分析:考察線性表中順序儲存的特點。
答案:n-i+1,n-i
試題2.已知連結串列的頭結點head,寫一個函式把這個連結串列逆序。
分析:考察線性表中鏈式儲存反轉演算法。
答案:
01. void List::reverse()
02. {
03. list_node * p = head;
04. list_node * q = p->next;
05. list_node * r = NULL;
06. while(q){;
07. r= q->next;
08. q->next = p;
09. p= q;
10. q= r;
11. }
12. head->next = NULL;
13. head = p;
14. }
試題3.找出單向連結串列中的中間結點。
分析:兩個指標,一個步長為1,另一個步長為2。步長為2的走到底後步長為1的正好到中間。
答案:
01. list_node * List::middleElement()
02. {
03. list_node * p = head;
04. list_node * q =head->next;
05. while(q){;
06. p= p->next;
07. if(q)q=q->next;
08. if(q)q=q->next;
09. }
10. }
試題4.如何檢查一個單向連結串列上是否有環。
分析:同樣兩個指標,一個步長為1,另一個步長為2,如果兩個指標能相遇則有環。
答案:
01. list_node * List::getJoinPointer()
02. {
03.
04. if(head == NULL ||head->next == NULL)return NULL;
05. list_node * one = head;
06. list_node * two =head->next;
07. while(one != two){
08. one =one->next;
09. if(two)two=two->next;
10. elsebreak;
11. if(two)two=two->next;
12. elsebreak;
13. };
14. if(one == NULL || two ==NULL)return NULL;
15. return one;
16. }