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;//返回新链表
}
}