反转链表一直是一个高频的面试点,今天我用两种方法实现一下:
反转链表的核心在于反转,我们反转的并不是数字,而是指向数字的箭头。
用上面的图来理解一下:原本的链表:node1.next = node2,那么反转之后就是node2.next = node1,总结一下就是:node1.next.next = node1,不知道大家理解了没有。
接下来我们用递归的方法来实现一下:
public ListNode reverseList(ListNode head){
if(head == null || head.next == null){
return head;
}
ListNode newNode = reverseList(head.next);
head.next.next = head;
head.next = null;
return newNode;
}
第二种方法使用的是迭代的思想:
箭头每反转一个,prev、curr、nxt一起往后移一个单位。
结束条件:curr = null,最后返回prev
public ListNode reverseList(ListNode head){
ListNode prev = null;
ListNode curr = head;
while(curr!=null){
ListNode nxt = curr.next;
curr.next = prev;
prev = curr;
curr = nxt;
}
return prev;
}
其实掌握了它的核心思想,反转链表也就不会太难了。