看见进步: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; } }