常見單鏈表面試題

2021-08-28 15:13:18 字數 3609 閱讀 2039

面試中經常被問到有關鍊錶的問題,現總結如下:(此處的鍊錶結構為不帶頭結點的單鏈表)

單鏈表結構

struct listnode 

};

1、尾插法建立單鏈表

listnode* buildlisttail(int n) 

else

}return head;

}// 輸入1 2 3 4,輸出1 2 3 4

2、頭插法建立單鏈表

listnode *buildlisthead(int n) 

return head;

}//輸入1 2 3 4,輸出4 3 2 1

3、列印鍊錶內容

void printlist(listnode *head) 

listnode *p = head;

while(p != null)

cout << endl;

}

4、反轉單鏈表

listnode *reverselist(listnode *head) 

return reversedhead;

}

5、求單鏈表的長度

int getlistlength(listnode *head) 

return length;

}

6、合併兩個有序鍊錶

//遞迴式合併

listnode *merge(listnode *head1, listnode *head2)

else

return mergehead;

}// 非遞迴式合併

listnode* merge(listnode *head1, listnode *head2)

else

listnode *p = head;

while(head1 != null && head2 != null)

else

p = p->next;

}if(head1 != null)

p->next = head1;

if(head2 != null)

p->next = head2;

return head;

}

7、求鍊錶的中間節點,若長度為偶數,則返回前面的節點

listnode* getmidnode(listnode *head) 

return slow;

}

8、求鍊錶的倒數第k個節點

listnode *findkthtotail(listnode *head, int k) 

behind = head;

while(ahead->next != null)

return behind;

}

9、判斷鍊錶中是否存在環

// 若返回節點不是null則存在環

// 一快一慢兩個指標,快的一次走2步,慢的一次走一步,若存在環,快的肯定能追上慢的

listnode *meetingnode(listnode *head)

return null;

}

10、求鍊錶中環的入口節點

// 判斷出有環後,求出環中的節點數目,最後求入口節點

listnode *entrynodeofloop(listnode *head)

// 先移動node1,次數為環中的節點數目

node1 = head;

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

node1 = node1->next;

// 再同時移動node1和node2

listnode *node2 = head;

while(node1 != node2)

return node1;

}

11、判斷兩個鍊錶是否相交(是否是y字型)

// 判斷兩個鍊錶的最後乙個節點是否相等

listnode *intersect(listnode *head1, listnode *head2)

listnode *q = head2;

while(q->next != null)

if(p->val == q->val)

return p;

return null;

}

12、兩個鍊錶的第乙個公共節點

listnode *findfirstcommonnode(listnode *head1, listnode *head2) 

listnode *firstcommonnode = null;

// 先在長鍊表上走幾步,再同時在兩個鍊錶上遍歷

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

longlist = longlist->next;

while((longlist != null) && (shortlist != null))

longlist = longlist->next;

shortlist = shortlist->next;

}return firstcommonnode;

}

13、單鏈表快速排序(交換節點時只需交換節點的值即可)

// 求單鏈表的劃分位置,該位置將鍊錶劃分為左右兩個子鍊錶

listnode *partition(listnode *head, listnode *tail)

q = q->next;

}swap(p->val, head->val);

return p;

}void quicksort(listnode *head, listnode *tail)

呼叫形式為quicksort(head, null)

14、單鏈表歸併排序

// 合併兩個有序鍊錶

listnode* merge(listnode *head1, listnode *head2)

else

listnode *p = head;

while(head1 != null && head2 != null)

else

p = p->next;

}if(head1 != null)

p->next = head1;

if(head2 != null)

p->next = head2;

return head;

}//求單鏈表的中間節點

listnode* getmidnode(listnode *head)

return slow;

}// 單鏈表歸併排序

listnode *mergesort(listnode *head)

// 呼叫形式為mergesort(head)

單鏈表 (面試題)

關於單鏈表的基本操作,之前已經總結過了,那些掌握之後算是了解了單鏈表是什麼?不過現在面試的題中,肯定不會只讓你回答單鏈表的基礎操作,總是會改變一些東西,或是擴充套件一下。下面就是一些關於單鏈表的擴充套件內容 include include include pragma warning disable...

單鏈表面試題

1.倒序列印鍊錶 void reverseprint slistnode pfirst 有兩種方法 1.遞迴操作 2.非遞迴操作 2 非遞迴 slistnode pend slistnode pcur pend null while pfirst pend pend pcur printf d pe...

單鏈表(面試題)

鍊錶反轉思路 1.單鏈表中有效節點的個數 2.查詢單鏈表中弟第k個節點 3.單鏈表的反轉 實現 如下 public class testlink 1單鏈表中有效節點的個數 遍歷得出個數 public static intcount heronode head int count 0 while tr...