有些許錯誤,第乙個程式
1.已知鍊錶的頭結點head,寫乙個函式把這個鍊錶逆序
[cpp]view plain
copy
void
list::reverse()
head->next = null;
head = p;
}
遞迴方法:
[cpp]view plain
copy
void
list::reverse2(list_node * curnode)
reverse2(curnode->next);
curnode->next->next=curnode;
if(curnode == head)
} 2.已知兩個鍊錶head1 和head2 各自有序,請把它們合併成乙個鍊錶依然有序。
[cpp]view plain
copy
void
list::merge(list & list)
tempa->next=b;
} else
tempb->next=a;
} }
}
遞迴方法:
[cpp]view plain
copy
list_node* list::recursive_merge(list_node * a,list_node * b)
if(a->value > b->value)
} 3.有乙個鍊錶l,其每個節點有2個指標,乙個指標next指向鍊錶的下個節點,另乙個random隨機指向鍊錶中的任乙個節點,可能是自己或者為空,寫乙個程式,要求複製這個鍊錶的結構並分析其複雜性
這個題目的方法很巧妙,將兩個鍊錶連線起來形成乙個鍊錶,設定好random指標後再將兩個鍊錶分割開來。
[cpp]view plain
copy
list list::copyrndlist()
else
cur=cur->next->next;
} cur = head;
while
(cur)
cur = head;
list_node * dst = cur->next;
while
(cur)
list newlist;
newlist.head = newhead;
return
newlist;
}
4. 找出單向鍊錶中中間結點
兩個指標,乙個步長為1,另乙個步長為2.步長為2的走到底後步長為1的正好到中間。
[cpp]view plain
copy
list_node * list::middleelement()
} 5. 如何檢查乙個單向鍊錶上是否有環
同樣兩個指標,乙個步長為1,另乙個步長為2,如果兩個指標能相遇則有環。
[cpp]view plain
copy
list_node * list::getjoinpointer()
if(one == null || two == null)
return
null;
return
one;
}
6.給定單鏈表(head),如果有環的話請返回從頭結點進入環的第乙個節點。
設煉表頭到環入口節點距離為x,環入口節點到兩個指標相遇節點距離為z,換長度為y,則有x+z+1=y,所以z=y-1-x,即乙個指標從鍊錶頭部開始移動,乙個指標兩個指標相遇後乙個節點開始移動,相遇的地方即為環入口
[cpp]view plain
copy
list_node * list::findcycleentry()
return
p;
}
7.只給定單鏈表中某個結點p(並非最後乙個結點,即p->next!=null)指標,刪除該結點。
將p後面那個節點的值複製到p,刪除p後面的節點
[cpp]view plain
copy
void
list::deletebypointer(list_node * node)
} }
8.在p前面插入乙個節點
在p後面插入新節點,將p的值與新建的節點值互換。
9.給定單鏈表頭結點,刪除鍊錶中倒數第k個結點
乙個指標指向煉表頭,另乙個指標指向第k個指標,然後兩個指標一起移動,第二個指標到了末端則第乙個指標就是倒數第k個節點
[cpp]view plain
copy
list_node * list::lastkelement(
intk)
if(p == null && t >0)
return
null;
list_node * q=head;
while
(q && p)
return
q;
}
10. 判斷兩個鍊錶是否相交。
兩種情況,如果鍊錶有環,則先在環裡設定乙個指標不動,另乙個鍊錶從頭開始移動,如果另乙個鍊錶能夠與環中的指標相遇則是相交。
如果沒有環,則判斷兩個鍊錶的最後個節點是否相同,相同則相交
[cpp]view plain
copy
bool
list::isintersecting(
const
list & list)
q=q->next;
} flag = true
; }
else
return
flag;
}
11. 兩個鍊錶相交,找出交點
求出兩個鍊錶的長度a和b,乙個指標指向較短鍊錶的頭head,另乙個指標指向較長鍊錶的第head+|a-b|,然後兩個指標一起移動,相遇處即為交點。
[cpp]view plain
copy
list_node * list::intersectnode(
const
list & list)
a = abs(cnt - list.cnt);
while
(p && a)
while
(p&&q)
if(p && q && p == q)
return
p;
return
null;
}
煉錶筆試題
反轉鍊錶 節點 class node object def init self,elem self.elem elem self.next none 鍊錶 class singlelist object def init self,head self.head head 反轉鍊錶 defrevers...
面經 煉錶筆試題
鍊錶的基本題型主要就以下這幾種,其他的基本是在這基礎上引申出來,所以如果基本掌握這幾種單向鍊錶的題,鍊錶基本沒什麼太大問題了。1.刪除無頭非尾節點 2.鍊錶的氣泡排序 3.反轉鍊錶 4.在當前節點前插入乙個資料x 5.查詢鍊錶的中間節點。6.刪除單鏈表的倒數第k個節點 k 1 k 總長度 對於上面這...
常考煉錶筆試題(一)
1 刪除鍊錶中等於給定值 val 的所有節點。示例 輸入 1 2 6 3 4 5 6,val 6 輸出 1 2 3 4 5 思路 要刪除鍊錶中等於給定值的所有節點,我們可以定義乙個結果鍊錶,再結合尾插的方法來實現。定義乙個last引用,指向結果鍊錶的最後乙個節點,cur引用指向給定鍊錶的第乙個節點。...