java c 資料結構面試題總結

2021-08-26 10:43:45 字數 4020 閱讀 6937

一.判斷鍊錶是否存在環型鍊錶問題:說明:判斷乙個鍊錶是否存在環,例如下面這個鍊錶就存在環,n1-->n2-->n3-->n4-->n5-->n2,環的開始結點是n5

解法:這裡有個比較簡單的解法:設兩個指標p1,p2,每次迴圈p1向前走一步,之向前走兩步,直到p2碰到null指標(無環)或兩個指標相等結束迴圈演算法(有環),即如果兩個指標相等則說明存在環。

**如下:

/*節點資料結構*/

struct link;

/**判斷是否有環的方法

**引數來頭節點的指標

*/bool isloop(link * head)

//迴圈前進,直到p2走到null或p2追上p1

dowhile(p2 && p2->next && p1!=p2);

//如果有環

if(p1 == p2)

二.鍊錶反**

說明:鍊錶反轉,比如原煉表是1-->2-->3-->4-->5 通過反轉後成為5-->4-->3-->2-->1

解法一:利用三個指標,指向當前要反轉的節點的指標,這個當前節點之前的節點指標,這個當前節點之後的節點指標;反轉後再向後繼續遍歷

**如下:

/*節點資料結構*/

struct linka;

/**反轉

**引數:頭節點的指標的引用

*/bool reverse(link * &head)

//反轉到最後,設定頭節點指標

head->next = null;

head = pre;

}

解法二:利用遞迴。這種方法的基本思想是在反轉當前節點之前先呼叫遞迴函式反轉後續節點。不過,這個方法有個缺點:在反轉後的最後乙個節點會形成乙個環,所以必須將函式的返回節點的next設為null.因為要改變head指標,所以我用了引用

**如下:

/*節點資料結構*/

struct linka;

/**反轉

**引數:頭節點的指標的引用

*/linka * reverse(linka * p,link * &head)else

}

三.鍊錶的合併:

說明:遞增有序的2個單鏈表合併成乙個遞增有序的單鏈表,不用任何庫函式呼叫

**如下:

#include using namespace std;

/* 單鏈表節點 */

struct node;

/* 給單鏈表新增節點 */

void insertnode(node* head, int value)

while ( p->next != null )

node* tmp = new node;

tmp->value = value;

tmp->next = null;

p->next = tmp;

}/* 遍歷輸出鍊錶節點 */

void print(node* head)

cout << endl;

}/* 下面實現不使用任何庫函式, 利用交換的方法在原空間實現整體有序。 方法是先確定哪乙個鍊錶

的第乙個節點的值小,把這個鍊錶的頭結點作為合併後鍊錶的頭結點,然後比較2個有序鍊錶的當前節點

的值,如果代表最後合併鍊錶的值小,則不用交換,否則把兩個值交換,最後合併鍊錶始終保持兩個值中

的小值。另乙個鍊錶由於交換了乙個元素,當前元素可能影響該鍊錶的有序遞增,對其進行調整使其保持

遞增有序,然後重複上述動作,直到乙個鍊錶遍歷結束,然後把剩餘的鍊錶連線起來就行。*/

/* 調整鍊錶的第乙個節點,使其變成遞增有序 */

void chg2sort(node* head, node* &p)

node* s = head;

while ( s->next != p )

//下面的一段找到第乙個大於p節點值的節點

node* q = p;

node* r = q;

while ( q != null )else

} //下面調整指標,其實可以統一寫出來,為了閱讀清晰把q為null和非null分開寫出來

if ( q == null )else if ( q != null )

//由於鍊錶進行了調換,當前鍊錶指標也需要改變

p = s->next;

}/* 兩個有序鍊錶進行合併 */

node* merge(node* head1, node* head2)else if ( q == null )

//兩個都不為空,先確定哪個鍊錶作為合併後的鍊錶

if ( (p != null) && (q != null) )else

} node* p_prior; //始終指向p節點的前乙個節點

node* q_prior;

while ( (p != null) && (q != null) )else if ( head == head2 )

}else if ( p->value == q->value )else if ( p->value > q->value )else if ( head == head2 )

}} if ( p != null )

if ( q != null )

return head;

}int main();

node* heada = new node;

heada->next = null;

for (int i = 0; i < 5; ++i)

print(heada);

/* 建立有序鍊錶b */

int b[3] = ;

node* headb = new node;

headb->next = null;

for (int i = 0; i < 3; ++i)

print(headb);

head = merge(heada, headb);

print(head);

return 0;

}

如果可以用庫函式合併的話:**如下:

node* mergeaction(node* head1, node* head2) 

else if(head1->data > head2->data)

} return head->next;

}

四.判斷兩個陣列中是否存在相同的數字,給定兩個排好序的資料,怎麼高效得判斷這兩個陣列中存在相同的數字:

說明:o(n)演算法,因為兩個陣列都是排序好的,所以只要一次遍歷就行了,首先設兩個下標,分別初始化為兩個陣列的起始位址,依次向前推進,推進的規則是比較兩個陣列中的數字,小的那個陣列的下標各前推進一步,直到任何乙個陣列的下標到達陣列末尾時,如果這時還沒碰到相同的數字,說明陣列中沒有相同的數字。

**如下:

bool findcommon2(int a, int size1,int b,int size2)

if(*ptoken=='')

ptoken = token;

rear = head;

}else }

char * returnv = new char[strlen(s1)+1];

int i=0;

while(!stack1.empty())

returnv[i]="";

return returnv;

}

java c 資料結構面試題總結

一.判斷鍊錶是否存在環型鍊錶問題 說明 判斷乙個鍊錶是否存在環,例如下面這個鍊錶就存在環,n1 n2 n3 n4 n5 n2,環的開始結點是n5 解法 這裡有個比較簡單的解法 設兩個指標p1,p2,每次迴圈p1向前走一步,之向前走兩步,直到p2碰到null指標 無環 或兩個指標相等結束迴圈演算法 有...

資料結構 面試題

python實現 寫個大概,import re def quick sort alist,first,last if first last return mid value alist first low first high last while low high while low mid va...

資料結構 面試題

2.棧2.2使用棧計算字尾表示式 2.3對棧的元素進行排序 2.4判斷表示式是否括號平衡 3.佇列 4.鍊錶 5.樹6.圖 7.字典樹 這是一種高效的樹形結構,但值得單獨說明 8.雜湊表 雜湊表 1.1 尋找陣列中第二小的元素 思路 公升序排序之後,輸出第二個數字 1.2 找到陣列中第乙個不重複出現...