面試中經常被問到有關鍊錶的問題,現總結如下:(此處的鍊錶結構為不帶頭結點的單鏈表)
單鏈表結構
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...