链表的反转问题(Reverse Linked List)
来源:互联网 发布:淘宝怎样卖虚拟物品 编辑:程序博客网 时间:2024/06/10 03:16
反转单链表思路有三种,
1.将1->2->3变为 2->1->3再变为3->2->1(头插法)
2.将1->2->3变成1<-2->3再变为1<-2-<3(反转法)
3.递归
下面我们分别进行如下编码
1.头插法
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode prehead(-1); prehead.next = head; ListNode *pre = &prehead; ListNode *cur = head; while(cur&&cur->next) { ListNode *tmp = pre->next; pre->next = cur->next; cur->next = cur->next->next; pre->next->next = tmp; } return prehead.next; }};
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(ListNode* head) { ListNode *pre = NULL; while(head){ ListNode* tmp = head->next; head->next = pre; pre = head; head = tmp; } return pre; }};
3.递归法
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(ListNode* head) { if(!head || !head->next) return head; ListNode* node = reverseList(head->next); head->next->next = head; head->next = NULL; return node; }};
有了最基本的链表反转操作,我们可以解决一些有意思的问题
比如判断链表是否有回文
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: bool isPalindrome(ListNode* head) { if(head == NULL || head->next == NULL) return true; ListNode* slow = head; ListNode* fast = head; ListNode* p = head; while(fast->next != NULL && fast->next->next !=NULL) { slow = slow->next; fast = fast->next->next; } slow->next = reverseList(slow->next); slow = slow->next; while(slow){ if(head->val != slow->val) return false; head = head->next; slow = slow->next; } return true; } ListNode* reverseList(ListNode* head){ ListNode* pre =NULL; ListNode* next = NULL; while(head != NULL) { next = head->next; head->next = pre; pre = head; head = next; } return pre; }};
0 0
- 链表的反转问题(Reverse Linked List)
- 206. Reverse Linked List&反转链表
- Reverse Linked List(反转链表)
- Reverse Linked List 反转链表
- Reverse Linked List(反转链表)
- Reverse Linked List(反转链表)
- LeetCode-Reverse Linked List II(反转链表)
- Leetcode Reverse Linked List II 反转部分单向链表
- 反转单向链表(reverse a singly linked list)
- LeetCode206——Reverse Linked List 反转链表
- [LeetCode-206] Reverse Linked List(链表反转)
- leetcode206/92---Reverse Linked List I/II(反转链表)
- 链表-Reverse Linked List(反转单向链表)
- [leetcode] Reverse Linked List II 链表反转
- [LeetCode]206. Reverse Linked List 链表反转
- LeetCode.206. Reverse Linked List(反转有序链表)
- LeetCode 206. Reverse Linked List 反转链表
- 92. Reverse Linked List II【遍历一遍就反转链表】
- uva 10806 Dijkstra, Dijkstra. (最小费最大流)
- BASH中的内置变量
- 配置Jenkins邮件
- Java中Timer的用法
- 文章标题
- 链表的反转问题(Reverse Linked List)
- HSP Profile注册过程(未完成)
- KAFKA学习总结
- 深入理解kafka设计原理
- ACM计算几何推荐
- 关于正则表达式
- PayPal - (REST 框架 PHP) Express Checkout(EC)快捷支付使用说明
- [C++设计模式] composite 组合模式
- jeecms修改后台路径