- 已知指针 p 指向单向不循环链表中的某一个节点,且不知道头结点。
问:如何删除 p 指向的节点?
答:
如果 p 指向的不是最后一个节点
定义一个指针 q 保存 p->next; 然后将 q 的数据域和指针域都覆盖到 p 指向的节点中
最后释放 q 指向的节点即可。
q = p->next;
p->data = q->data;
p->next = q->next;
free(q);
q = NULL;
如果 p 指向的是最后一个节点了,就只能free(p)了,且没法修改倒数第二节点的指针域了
- 问:如何通过一趟遍历找到单向不循环链表的中点?
答:可以通过 快慢指针 实现
定义两个指针 p q 都指向链表开头
然后开始循环, p每次走2步,q每次走1步
当 p 走到结尾时,q 指向的就是链表的中点
//如果是代码实现 要注意 得保证 p->next 不是NULL 才能取 p->next->next
while(NULL != p || NULL != p->next){
p = p->next->next;
q = q->next;
}
- 顺序表(数组)和链表有什么区别?
答: 链表增删容易,O(n)查找难
顺序表增删难,O(1)查找容易;
顺序表需要提前确定长度,扩展空间难度较大
链表用多大空间就申请几个空间,扩建难度低