三种方法实现反转单链表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三种方法实现反转单链表相关的知识,希望对你有一定的参考价值。

单链表数据结构定义

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode, *LinkedList;

假设链表有一个头指针list,list->next指向链表的第一个结点;链表最后一个结点指向null。

方法一

(1)新建一个链表;

(2)从前向后遍历原链表;

(3)将原链表逐个插入到新链表的首部;

LinkedList ReverseSinglyLinkedList(LinkedList list)
{
    LinkedList    newList;    //新链表的头结点
    LNode *tmp;        //指向list的第一个结点,也就是要摘除的结点

    //
    //参数为空或者内存分配失败则返回NULL
    //
    if (list == NULL || (newList = (LinkedList)malloc(sizeof(LNode))) == NULL)
    {
        return NULL;
    }

    //
    //初始化newList
    //
    newList->data = list->data;
    newList->next = NULL;

    //
    //依次将list的第一个结点放到newList的第一个结点位置
    //
    while (list->next != NULL)
    {
        tmp = newList->next;            //保存newList中的后续结点
        newList->next = list->next;        //将list的第一个结点放到newList中
        list->next = list->next->next;        //从list中摘除这个结点
        newList->next->next = tmp;        //恢复newList中后续结点的指针
    }

    //
    //原头结点应该释放掉,并返回新头结点的指针
    //
    free(list);
    return newList;
}

方法二

(1)找到链表的最后一个结点last;

(2)重复:把第一个结点放到last后边;

(3)终止:last为第一个结点;

 1 LinkedList ReverseSinglyLinkedList(LinkedList list) {
 2     LNode *tmp = NULL; //每次移动的临时结点,指向链表的第一个结点
 3     LNode *last = NULL;//指向原始链表的尾结点
 4     //
 5     //判断list以及list->next是否为空
 6     //
 7     if (list == NULL || list->next == NULL) {
 8         return NULL;
 9     }
10     //
11     //找到最后一个结点
12     //
13     last = list->next;
14     while (last->next != NULL) {
15         last = last->next;
16     }
17     //
18     //每次把当前链表的第一个结点移动到原始链表的尾节点后边
19     //
20     while (list->next != last && list->next != NULL) {
21         first = list->next;
22         list->next = list->next->next;
23         first->next = last->next;
24         last->next = first;
25     }
26     return list;
27 }

方法三

(1)用一个指针遍历原始链表的每个结点;

(2)把当前遍历的结点放在list后边;

(3)终止:遍历到原始链表的尾节点;

 1 LinkedList ReverseSinglyLinkedList(LinkedList list) {
 2     LNode *tmp_head = NULL;
 3     LNode *p = NULL;
 4 
 5     if (list == NULL || list->next == NULL) {
 6         return NULL;
 7     }
 8 
 9     tmp_head = list->next;
10     while (tmp_head->next != NULL) {
11         p = tmp_head->next;
12         tmp_head->next = p->next;
13         p->next = list->next;
14         list->next = p;
15     }
16     return list;
17 }

Reference

http://www.cnblogs.com/pianoid/archive/2011/05/03/reverse-a-singly-linked-list.html

 

以上是关于三种方法实现反转单链表的主要内容,如果未能解决你的问题,请参考以下文章

反转单链表 (三种方法整理)

反转单链表 (三种方法整理)

单链表反转java代码

理解单链表的反转(java实现)

高效代码之反转单链表

单链表反转