反转链表
个人博客
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
题解
-
循环法
- 时间复杂度 O(n) 空间复杂度 O(1)
- 设置三个节点front、middle、behind(节点名米一定要见名知意)
- 判断输入是否为空,输入是否只有一个节点
- while 循环五部曲
- 循环条件设置为 middle != null
- 保存 middle.next
- 将 middle.next 修改为 front
- 将 front 修改为 middle
- 将 middle 修改为 behind
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList(ListNode head) { if(head == null)return null; if(head.next == null)return head; ListNode front = head,middle = front.next,behind; front.next = null; while(middle != null){ behind = middle.next; middle.next = front; front = middle; middle = behind; } return front; } }
-
递归
注入灵魂的地方(利用了递归的出入栈,头结点先进,后出,为节点后进先出。先出可以将此刻的节点指向后出的节点)
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { ListNode turnedHead = null; public ListNode reverseList(ListNode head) { if(head == null)return null; turnRecurse(head); head.next = null; return turnedHead; } ListNode turnRecurse(ListNode node){ if(node.next == null){ turnedHead = node; return node; } //注入灵魂的地方 return turnRecurse(node.next).next = node; } }
牛逼!!
这空间占用太大了,没有实际用处 hhhhh
总结
- 鲁棒性
- 输入为 null
- 输入的链表只有一个节点
- 翻转链表五部曲(记住套路驶得万年船)