206反转链表
解法
- 双指针
- 递归
双指针解法
public ListNode reverseListNode(ListNode head){
// 1: 边界条件;
if(head==null || head.next ==null){
return head;
}
// 2: 定义指针,便于在反转时,每次向后移动一个节点位;
ListNode pre = null;
ListNode curr = head;
while(curr!=null){
ListNode temp = curr.next;
curr.next = pre;
// pre 向后移动一位(注意,这一步特别容易犯错)
pre = curr;
// curr 也向后移动一位;
curr = temp;
}
return pre;
}
递归解法
- 将真的,递归解法,不是很好理解,但是,我们可以通过在关键代码处,打印log,帮助自己理解;
public ListNode reverseList(ListNode head) {
// 边界条件,也是递归终止的条件
if(head==null||head.next==null){
return head;
}
// 当前的头节点,如果原始链表是:1->2->3->4->5
// 那么 curr 就是5,并且在递归的过程中不会变,不信,看log
ListNode curr = reverseList(head.next);
System.out.println("curr value : "+curr.val+", head value : "+head.val);
// 例如:head 节点是4,
// 节点4的下一个节点,就是节点5,
// 节点5 的下一个节点连接到当前head节点
head.next.next = head;
// 将节点4和节点5 断开
head.next = null;
// 返回节点5
return curr;
}
- LOG
- curr value : 5, head value : 4
- curr value : 5, head value : 3
- curr value : 5, head value : 2
- curr value : 5, head value : 1
ps: 递归解法,还是今天刻意学的,我还是比较倾向 双指针 解法,递归嘛。。你自己的思维要有深度才能理解,若是没有深度,怎么办呢? 憋着尿劲儿,使劲想吧,,,,画画图。。。不说了,笔者去上个厕所,,,,