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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dengminghli/article/details/76165397

写在前面的废话:笔记本坏掉了,一插入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);
 }

猜你喜欢

转载自blog.csdn.net/dengminghli/article/details/76165397