链表相关习题

链表是笔试经常需要考到的类型,所以我查阅了相关资料,补充一下弹药库

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指针遍历该链表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值