java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 |
---|
解题思路 |
---|
将链表按奇偶顺序,分成两个链表。最后将偶数链表放在奇数链表后面,下图中,even表示偶数下标,odd表示奇数下标,evenhead表示奇数链表的头结点
代码:时间复杂度O(n) 空间复杂度O(1):因为上面图解中的代码量少,但是比较难以理解,所以我会给出两个版本的代码,第一个代码量少,第二个更容易理解,但是两种版本效率是完全一样的。 |
---|
- 代码量少的
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode oddEvenList(ListNode head) {if(head == null || head.next == null) return head;ListNode odd = head;//指向奇数下标的头结点,并充当遍历结点ListNode evenHead = head.next; //指向偶数下标的头结点ListNode even = headB;//even表示偶数结点while(even!=null&&even.next!=null){//如果有结点可以遍历odd.next = even.next;//even指向偶数结点,那么它的下一个必然是奇数结点。放入奇数链表odd = odd.next;//奇数链表指针odd后移,那么odd的下一个就是偶数结点了even.next = odd.next;//让odd后面这个偶数结点,加入到偶数链even中even = even.next;//even后移,再次到偶数结点}odd.next = evenHead;//将偶数头结点,放到奇数链表末尾return head;//返回重新排列的链表}
}
- 代码量大的,但更容易理解。
class Solution {public ListNode oddEvenList(ListNode head) {if(head == null || head.next == null) return head;ListNode headA = head;//headA表示奇数链表头结点ListNode headB = head.next; //headB表示偶数链表头结点ListNode current = headB.next;//current表示下一个该遍历的结点ListNode currentA = headA,currentB = headB;//currentA和currentB是奇偶两个链表的遍历指针boolean flag = true;//flag = true表示当前结点应该插入到奇数链表while(current!=null){//如果有结点可遍历currentA.next = null;currentB.next = null;//防止环的存在if(flag==true){//放headA中,表示奇数下标currentA.next = current;//插入到奇数链表尾部currentA = currentA.next;//奇数链表指针后移flag = false;//下一次插入偶数链表}else{currentB.next = current;currentB = currentB.next;flag = true;}current = current.next;//原链表指针后移}currentA.next = headB;//最后将偶数链表插入到奇数链表后面return headA;//返回新链表}
}