标签:
单链表数据结构定义
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
标签:
原文地址:http://www.cnblogs.com/CheeseZH/p/5255719.html