面试不可不会的单链表反转
2021-02-17 22:08
956 查看
单链表反转是面试中常考的一道题,这道题看起来简单,但是能一遍写出 bug free 的代码相当不容易,本文主要提供递归和迭代两种解题方法,供大家参考。
题目
举栗
为了便于理解,以 1->2->3->NULL 为栗子,如下图示:
递归解法
链表具有天然的递归性,一个链表例如:1->2->3->NULL,可以看成以值为 1 的节点作为头节点后面挂接一个更短的(以值为 2 的节点为头节点)的链表,即1->更短的链表(以值为2的节点作为头节点),同理以值为2的节点作为头节点后面也挂接一个更更短的链表(以值为3的节点作为头节点);依次类推,如下图示。
有了这样的思考,链表反转就可以先翻转头节点后面挂接的更短的链表,然后再在翻转后的更短链表的后面挂接之前的头节点。具体如下图示:
Show me the Code
// C语言版本 struct ListNode* reverseList(struct ListNode* head){ /* 特判 */ if (head == NULL || head->next == NULL) { return head; } /* 翻转头节点(节点值为 1 的节点) 后面挂接的链表(以节点值为 2 的节点作为头节点) */ /* 翻转之后变成 3->2 */ struct ListNode *node = reverseList(head->next); /* 将头节点(节点值为 1 的节点)挂接在翻转之后的链表的后面(也就是节点值为 2 的节点的后面) */ head->next->next = head; /* 将尾节点的下一节点置空 */ head->next = NULL; return node; }
#python3 版本 class Solution: def reverseList(self, head: ListNode) -> ListNode: if not head or not head.next: return head node = self.reverseList(head.next) head.next.next = head; head.next = None; return node;
迭代(双指针)解法
可以用双指针来做,用一个指针 next 记录当前节点的后一节点,另外一个指针 pre 记录当前节点的前一个节点,如果当前节点是头节点,则 pre 为空指针,还是以链表:1->2->3->NULL 为栗子,具体如下图示。
Show me the Code
// C语言版本 struct ListNode* reverseList(struct ListNode* head){ /* 记录当前节点的前一节点 */ struct ListNode* pre = NULL; while (head != NULL) { /* 记录当前节点的后一节点 */ struct ListNode* next = head->next; head->next = pre; pre = head; head = next; } return pre; } < ad8 /pre>
// go语言版本 func reverseList(head *ListNode) *ListNode { var pre *ListNode = nil for head != nil { next := head.Next head.Next = pre; pre = head head = next } return pre }
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】
- [面试] [反转链表] 三变量提头法
- 面试题目-链表反转
- 面试中常见链表问题7:反转链表2
- leetcode:Reverse Nodes in k-Group(以k为循环节反转链表)【面试算法题】
- [面试] [反转链表] 三变量提头法
- 20140707电话面试(单链表反转)
- 面试16: 反转链表
- 程序员面试题目总结--链表(3)【单链表反转】
- 面试之路(28)-反转链表(reverse ListNode)
- 微软面试100题---单链表就地反转
- 【剑指Offer面试编程题】题目1518:反转链表--九度OJ
- 【LeetCode-面试算法经典-Java实现】【025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)】
- 面试 考虑链表反转的递归实现
- 单链表反转 -面试
- 链表反转&nbsp;58面试“留念”
- 【剑指Offer面试编程题】题目1518:反转链表--九度OJ
- Coding一下“反转单链表”,当是下周面试的练笔
- 链表相关面试题目 反转 合并
- 面试100题---1反转链表