题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解答思路:
方法一:双指针
实现代码:
ListNode* reverseList(ListNode* head) {
if(head == NULL || head -> next == NULL) return head;
ListNode* cur = NULL, *pre = head;
while(pre != NULL){
ListNode* t = pre->next;
pre->next = cur;
cur = pre;
pre = t;
}
return cur;
}
方法二:递归
链表具有天然的递归性,一个链表例如** 1->2->3->4->5->NULL** ,可以看成头节点(节点值为 1 的节点)后面挂接一个更短的链表(缺少节点值为 1 的节点,以节点值为 2 的节点为头节点) 1->更短的链表,依次类推。如下如示:
这样的话,就可以先翻转头节点后面挂接的链表,然后把翻转后的链表的后面再挂接头节点,这样就实现了链表的翻转,如下图示:
先翻转以节点值为 2 的节点作为头节点的链表
将原头节点(节点值为 1 的节点)挂接在翻转之后的链表的后面
动图理解:
递归结束条件:
- 节点是空节点;
- 当前只有这一个节点,无需再翻转。
实现代码:
ListNode* reverseList(ListNode* head) {
if(head == NULL || head->next == NULL) return head;
// 递归调用反转的每一个节点
ListNode *node = reverseList(head->next);
// 每一个节点是怎么反转的
head->next->next = head;
// 防止链表循环
head->next = NULL;
// 每层节点都返回node,也就是最后一个节点
return node;
}
有不同见解,欢迎留言指导啊!!!