leetcode 剑指 Offer 24. 反转链表_leetcode题

leetcode 剑指 Offer 24. 反转链表_迭代_02

class Solution {
public ListNode reverseList(ListNode head) {
//不依靠中间变量 以迭代的方式很难完成
ListNode cur=head,pre=null,temp=null;
while(cur!=null){
//临时变量指向cur的下一个 这样cur=head 就可以指向null了
temp=cur.next;
//第一次遍历直接指向null 而后需要pre往后移动
cur.next=pre;
//往后移动的下个位置正好是cur
pre=cur;
//cur也要往后移动
cur=temp;
}
return pre;
}
}

递归求解

leetcode 剑指 Offer 24. 反转链表_迭代_03

class Solution {
//递归的方式 将大问题 拆分成一个个的小问题
public ListNode reverseList(ListNode head) {
//如果只有两个节点 我们应该怎么做?
//head的后一个节点的next指针指向head 然后head的next指针指向空即可 1
//第二步 头节点可能为空 或者是遍历到最后一个节点了 递归结束的条件
if(head==null || head.next==null){
return head;
}
//递归 一直到最后一个节点
ListNode newNode=reverseList(head.next);
//第一步
head.next.next=head;
head.next=null;
//如果是多个呢? 我们就需要找到最后的一个节点 然后在用这种方式即可 看上面 2

//最终返回最后一个节点即可
return newNode;
}
}

还有一点 如果找到最后一个元素?

最关键的就是下面的代码了

if(head==null || head.next==null){
//当遍历到最后一个元素的时候 直接返回 也就是说最后接收的元素就是末尾节点
return head;
}
//递归 一直到最后一个节点
ListNode newNode=reverseList(head.next);