【链表】反转单链表
2012-07-05 10:53
176 查看
比如单链表A -> B -> C -> D -> E -> F -> NULL 反转得到 F -> E -> D -> C -> B -> A -> NULL
【算法一】
最通用的算法,对于当前要反转的节点,在反转过程中牵扯到3个节点:前继节点(pPre)、当前节点(pCur)、后继结点(pNext),当然在算法实现的过程中有时候多增加一些变量能带来事半功倍的效果,在这里我们额外定义一个指针变量,用来保存反转后的头节点(pReversedHead),反转的过程实际上就是把当前节点的next指针指向前继节点,后继结点用来保证链表不断裂,所以预设3个指针,步步向前移动,直至NULL,然后返回尾节点的地址。
由于遍历一次可完成反转,时间复杂度为O(n)。
【算法二】
递归法。
优点:代码精简。
缺点:不易理解,且如果链表很长容易导致栈溢出。
【算法一】
最通用的算法,对于当前要反转的节点,在反转过程中牵扯到3个节点:前继节点(pPre)、当前节点(pCur)、后继结点(pNext),当然在算法实现的过程中有时候多增加一些变量能带来事半功倍的效果,在这里我们额外定义一个指针变量,用来保存反转后的头节点(pReversedHead),反转的过程实际上就是把当前节点的next指针指向前继节点,后继结点用来保证链表不断裂,所以预设3个指针,步步向前移动,直至NULL,然后返回尾节点的地址。
由于遍历一次可完成反转,时间复杂度为O(n)。
listnode* ReverseLinklist(listnode* pHead) { linknode* pReversedHead = NULL; linknode* pb = NULL; //前继节点 linknode* pc = pHead; //当前节点 linknode* pa = NULL; //后继节点 while(pc != NULL) { pa = pc->next; //如果当前节点的后继结点为NULL,则说明当前节点即为尾节点 if(pa == NULL) { pReversedHead = pc; } pc->next = pb; pb = pc; pc = pa; } return pReversedHead; }
【算法二】
递归法。
优点:代码精简。
缺点:不易理解,且如果链表很长容易导致栈溢出。
Node *ReverseList(Node *p,Node *head) { Node *tmp; if(p->next == NULL) { head->next = p; return p; } tmp = ReverseList(p->next,head); tmp->next = p; p->next = NULL; return p; }
相关文章推荐
- 单链表操作 头插入 尾插入 链表反转
- Java中单链表的实现和单链表的反转(倒置)
- 链表——实现单链表的反转
- 逆置/反转单链表+查找单链表的倒数第k个节点,要求只能遍历一次链表
- 从无头单链表中删除节点及单链表的反转操作
- 链表之单链表的反转总结
- 单链表的反转(用循环和递归实现单链表反转)
- C语言:【单链表】逆置反转单链表
- 5.数据结构单链表之链表反转
- 20140719 找到单链表的倒数第K个节点 判断一个链表是否成为一个环形 反转
- 单链表的逆置\反转,单链表的排序升序,单链表排序降序
- Java单链表基本操作(四)--单链表反转
- 单链表反转,单链表创建,单链表尾部插入,单链表打印
- Java中单链表的实现和单链表的反转(倒置)
- Java 单链表的反转 以及 双向链表的实现
- 左程云_算法与数据结构 — 链表问题 — 05反转部分单链表
- leetcode_234. Palindrome Linked List 判断单链表是否为回文串,快慢指针法找中间节点,反转单链表
- 反转单链表+合并有序单链表+查找单链表中倒数第k个节点--20150924
- 反转单链表的值,但不改变链表指针地址
- 单链表(四)——链表的反转