typedef struct node {
char *data;
struct node *next;
} node_t;
我们约定一个打印链表的函数:
void list_display(node_t *head)
{
for (; head; head = head->next)
printf("%s ", head->data);
printf("\n");
}
下面是几个常见的链表笔面问题:
1.计算链表长度
很简单:(复杂度O(n))
int list_len(node_t *head)
{
int i;
for (i = 0; head; head = head->next, i++);
return i;
}
测试:
int main(int argc, const char *argv[])
{
node_t d = {"d", 0}, c = {"c", &d}, b = {"b", &c}, a = {"a", &b};
printf("%d\n", list_len(&a));//4
return 0;
}
2.反转链表
我们多用几个指针就可以在O(n)完成反转任务:
算法:t遍历链表, q记录t的上一个结点, p是一个临时变量用来缓存t的值
void