看见进步:bingo!!

这道题虽然,没有想法,但是,通过阅读视频指导的方法后,发现我对java对象和引用的关系,还是有点模棱两可的,导致我的算法,提升一直都是有问题,这次总算再次找到,我的知识盲点并消除了。

主要是如下的两句话,引起了我的困惑:

    ListNode even = head.next; //指向偶数位指针
    ListNode evenHead = even; //保留偶数位指针头

让我想到了,如下代码:

    ListNode res = new ListNode(0);
    ListNode cur = res;
    cur.next = new ListNode(1);
    cur = cur.next;

盲区解毒:Java中的引用和对象

关于引用指向对象的规则

1、只有引用指向对象,没有引用指向引用

不像c/c++指针可以指向指针,Java只有引用指向对象,没有对象指向引用,也没有引用指向引用,更没有对象指向对象。

String str = "nihao";
String str1 = str;

这里的内存结构是这样的:

2、对象可以被多个引用指向

根据我们上面画的图,这一点显而易见。

3、引用被=于其他引用

就像下面的 cur = res,之后,cur = cur.next,只是这个引用指向了另一个对象,不改变原有对象的属性值和状态,也就是刚开始

cur指向的是new ListNode(0)这个对象,后面cur指向了 cur.next指向的另一个对象,不改变又有对象的状态。

实验代码,可以证实我的理论:

解题思路:

1、定义双指针, odd、even,还有保留even表头指针evehead;

2、while循环,交替修改odd、even链表next节点并遍历下一个

3、把evenhead指向odd链表的尾节点。

过程,我画图了,如下:

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode oddEvenList (ListNode head) {
        if(head == null) {
            return head;
        }
        ListNode odd = head; //指向奇数位指针
        ListNode even = head.next; //指向偶数位指针
        // 特别要注意理解这句话,
        // 和后面的修改意味着什么?
        // java只有引用指向对象,没有引用指向引用
        // 所以,你后面调试后,你会发现
        ListNode evenHead = even; //保留偶数位指针头
 		
	  	// 这里交替,修改指针内容,具体过程可以看上面原理图,
	    // 在修改过程中,因为不改变后面内容,所以不用中间变量承载内容
        while(even!=null && even.next!=null) {
            odd.next = even.next;
            odd = odd.next; 
            even.next =odd.next;
            even = even.next;
        }

        odd.next = evenHead;

        return head;
    }
}