鍊錶是最基本的資料結構,面試官也常常用鍊錶來考察面試者的基本能力,而且鍊錶相關的操作相對而言比較簡單,也適合考察寫**的能力。鍊錶的操作也離不開指標,指標又很容易導致出錯。綜合多方面的原因,鍊錶題目在面試中佔據著很重要的地位。
首先我們給出鍊錶的基本資料結構以及構建和遍歷函式:
單鏈表基本定義以及構建和遍歷函式:
//definition for singly-linked list.
struct listnode
}; void addfront(int val, listnode** head)
listnode* addfront1(int val, listnode* head)
// 由乙個vector構建乙個list
void constructor(vector
& vec, listnode** root)
}
void showlist(listnode* root)
cout
<< endl;
}
void reverseshowlisr(listnode* head)
while(!nodestack.empty())
cout
<< endl;
}
求解單鏈表中節點個數
// 時間複雜度o(n)
int getlength(listnode* root)
return res;
}
翻轉單鏈表
listnode* reverselist(listnode* head)
return pre;
}
獲得單鏈表倒數第k個元素
listnode* getrkthnode(listnode* head, unsigned int k)
// 節點個數小於k時,返回什麼?
if(k >1||
!heada) return
null;
while(heada)
return headb;
}
獲得鍊錶中間節點
listnode getmiddlenode(listnode* head)
return slow;
}
合併兩個有序的單鏈表
// 非遞迴實現
listnode* mergesortedlist(listnode* heada, listnode* headb)
res->next = heada? heada : headb;
return temp->next;
}// 遞迴實現
listnode* mergesortedlist1(listnode* heada, listnode* headb) else
return res;
}
判斷兩個單鏈表是否相交
bool isintersected(listnode* heada, listnode* headb)
while(headb->next)
return heada == headb;
}
如果兩個單鏈表相交,求解相交的第乙個節點
listnode* getintersectionnode(listnode* heada, listnode* headb)
returna;
}
判斷單鏈表是否存在環
bool iscircle(listnode* head)
return
false;
}
如果乙個單鏈表存在環,求解進入環的第乙個節點
listnode *detectcycle(listnode *head)
return entry;}}
return
null; // there has no cycle
}
對於面試的種種
搞it的人,如果沒有被面試過,那估計100w程式設計師中也找不出幾個,對於如何應對面試,相信有很多相關的策略,甚至有專門的 來協助大家,這裡就不再贅述了。只是,最近見到或者聽到一些國內比較有名的公司的面試,忍不住想要說幾句。首先,就是 直覺 人與人之間的直覺在剛見面的那幾分鐘之內就已經建立,而且這種...
單鏈表總結 單鏈表中的必不可少的面試題
獲取單鏈表節點的個數 1 獲取單鏈表節點的個數 這個題比較簡單 思路 使用while遍歷節點,只要temp!null就是有效節點 面試題1 求單鏈表中有效節點的個數 不統計頭節點 public static intgetlength heronode head 新增乙個輔助節點 heronode t...
單鏈表的面試題
自定義標頭檔案部分 void deletenottail pnode pos 刪除乙個無頭單鏈表的非尾節點 void insertnothead pnode phead,pnode pos,datatype data 在無頭單鏈表的乙個非頭節點前插入乙個節點 void josephcircle pn...