链表是笔试经常需要考到的类型,所以我查阅了相关资料,补充一下弹药库
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");
}
计算该链表的长度
int list_len(node_t *head)//计算链表长度
{
int i;
//for (i = 0; head; head = head->next, i++);
while(head)
{
head=head->next;
i++;
}
return i;
}
翻转链表,即将链表指针的方向从后往前指
void reverse(node_t *head)//将链表反转
{
node_t *t=0,*q=0,*p=0;
for(t=head;t;)
{
//t=t->next;
q=t->next;
t->next=p;
p=t;
t=q;
}}
寻找倒数第k个节点的值
node_t *_kth(node_t *head, int k)//寻找链表中倒数第k个值
{
int i = 0;
node_t *p = head, *q = head;
for (; p && i < k; p = p->next, i++);
if (i < k) return 0;
for (; p->next; p = p->next, q = q->next);
return q;
}
我们的方法就是给定两个指针,p指针从前往后遍历k个节点,q指针指向链表的头节点然后p指针和q指针一起遍历。当p指针到达尾节点的时候,q指针就遍历到了倒数第k个节点
不得不说这种放大是比较巧妙的
合并两个链表
node_t * hebin(node_t *head,node_t *end)/
{
node_t *p=(node_t *)malloc(sizeof(node_t));
node_t *q=(node_t *)malloc(sizeof(node_t));
p=head;
q=end;
while(p->next)
p=p->next;
p->next=q;
while(q->next)
q=q->next;
return head;
}
定义两个指针p,q分别指向待连接的链表,然后遍历前一个链表head直到尾节点,然后将p指针指向下一个链表的头结点q,然后让q指针遍历该链表