C++面试题相关
单链表的节点数据模型
struct list_node_t
{
int data;
list_node_t* next;
};
反转链表操作
list_node_t* reverse_list(list_node_t* head)
{
list_node_t* p = head;
list_node_t* q = head;
list_node_t* new_list = 0; // 反转后的新链表
while ( p )
{
// 在新链表的头部插入节点p
q = p->next;
p->next = new_list;
new_list = p;
p = q; // p和q指向下一个节点
}
return new_list;
}
2. 环链表问题: 判断一个链表是否包含环
1 bool list_have_ring(list_node_t* head)
2 {
3 // 空链表
4 if ( !head )
5 {
6 return false;
7 }
8
9 // 链表仅包含一个元素,且形成自环
10 if ( head->next == head )
11 {
12 return true;
13 }
14
15 // 反转链表的头结点和原链表头结点是否相同
16 return ( (ReverseList(pHead) == pHead) ? TRUE : FALSE);
17 }
3. 两个升序排列的数组,打印两个数组的交集
例如: int a[] = {-10, 2, 5, 6, 8, 10, 20}; int b[] = {-15, 3, 4, 6, 7, 15, 20, 25};
1 void intersection(int a[], int n, int b[], int m)
2 {
3 // 数组下标
4 int index_a = 0;
5 int index_b = 0;
6
7 while ( (index_a < n) && (index_b < m) )
8 {
9 if ( a[index_a] == b[index_b] )
10 {
11 printf("%d\n", a[index_a]);
12 ++index_a;
13 ++index_b;
14 }
15 else if ( a[index_a] < b[index_b] )
16 {
17 ++index_a;
18 }
19 else
20 {
21 ++index_b;
22 }
23 }
24 }