链表反转
题目参考 反转链表
目录
链表的反转是非常基础的一种操作,在《剑指Offer》以及其他大部分面试书中基本都有这个简单的题目作为铺垫。首先分析旋转:
链表的反转有两种方式:一种是递归;一种是迭代
本篇文章就两种方式进行分析以及实现
创建节点 ListNode
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
迭代反转
迭代反转是从链表的开头一个一个反转到结束
步骤图解
时间复杂度:O(n),假设 nn 是列表的长度,时间复杂度是 O(n)。
空间复杂度:O(1)。
代码实现
public ListNode reverseList(ListNode head) {
ListNode result = null;
ListNode current = head;
while(current!=null){
ListNode tempNode = current.next;
current.next = result;
result = current;
current = tempNode;
}
return result;
}
递归反转
思路可拆分为
从尾部开始递归,一直反转到头部,实现整个链表的反转
步骤图解
递归对于迭代要稍微难理解一点,不过仔细思考思考还是能理解出来的。
代码实现
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) return head;
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}