知识点13:手写代码-倒转链表的c语言实现

来源:互联网 发布:网络教育 学籍 编辑:程序博客网 时间:2024/06/15 17:51

写在前面的废话:笔记本坏掉了,一插入8g的内存卡就开不了机,而不插入的话可以开机,但是又启动不了AS。不知道是内存卡的问题还是电脑接口的问题,想哭。这段时间要等同学带他的电脑过来帮我测试,所以关于Android的内容暂时是写不了的了~
然后,秋招火爆到来,这段时间除了一边继续学习嵌入式外,其他的莫过于准备秋招了。数据结构和算法是我的弱点中的弱点,所以需要加强,所以遇上一些常见的算法题的时候,还是会试着去写,然后贴出来的,算是积累体验吧。今天的是倒转链表的实现

倒转链表的思路

关于倒转链表的实现,一般的问题形式是从尾到头打印链表中的数据,这样的话其实会有两种情形,分别是打印数据而不改变链表结构,就比如你只需要用数组依次存储链表数据,再方向打印。或者递归遍历链表打印数据即可,这个比较简单,容易实现。而另外一种则是需要真正的反转链表每个节点的指向方向,彻底改变结构再依次打印,技术要求是比较大的。所以如果被问到这个问题时,需要先和面试官沟通好,用哪种形式。下面是第二种形式的思路:
递归思想。循环遍历链表,分别用两个指针p和q记录两个相邻的节点,如果q处于尾节点的时候,则使其指向前面的q,并将q指针的next指针设为NULL。然后递归上面操作,直到链表头指针的指向为NULL的时候,从新设置链表的头指针指向尾节点。从而完成反转。出现的一个问题是不知道如何在递归中预先存储尾节点。解决思路是首先通过方法得到链表的尾节点,作为倒转方法的参数传递过去。实现如下:

倒转链表的实现

/*获得链表的尾节点地址*/Node *get_tail_node(Linked *linked){        Node *p=linked->head;        while(p->next!=NULL){            p = p->next;        }        return p;};/*倒转链表方法 linked:需要倒转的指针 head:存储的尾节点地址,由get_tail_node()方法传入*/void reverse(Linked *linked,Node *head){    //当头指针的指向为NULL时,代表链表倒转成功    if(linked->head->next==NULL){    linked->head = head;    return;    }    //p,q表示相邻的两个链表节点    Node *p=linked->head;    Node *q=p->next;    //q跳转到尾节点,p为尾节点的前驱    while(q->next!=NULL){    p=p->next;    q=p->next;    }    //倒转链表指向    q->next=p;    p->next=NULL;    //递归以上操作    reverse(linked,head); }