一、前言
将单链表的所有下标为奇数的结点移动到下标为偶数的结点前,例如输入:1->2->3->4->5->null,输出:1->3->5->2->4->null
二、算法思路
方法一:暴力法
创建一个新的链表,遍历链表的时候遇到下标为偶数的结点就将其从当前链表摘出来并尾插至新链表,遍历结束再将新链表尾插至原来链表,此方法略去实现
方法二:双指针
定义两个头指针,分别指向奇偶链表的头结点,初始时奇链表头指针oddHead = head;偶链表头指针evenHead = head.next; 再定义两个工作指针 oddCurrent = oddHead; evenCurrent = evenHead
分析过程
代码实现过程
三、算法Java实现
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: a singly linked list
* @return: Modified linked list
*/
public ListNode oddEvenList(ListNode head) {
// write your code here
if(head == null || head.next == null){
return head;
}
ListNode oddHead = head;
ListNode evenHead = oddHead.next;
ListNode oddCurrent = oddHead;
ListNode evenCurrent = evenHead;
while( evenCurrent != null && evenCurrent.next != null && evenCurrent.next.next != null
|| oddCurrent.next != null && oddCurrent.next.next != null) {
oddCurrent.next = evenCurrent.next;
oddCurrent = oddCurrent.next;
evenCurrent.next = oddCurrent.next;
evenCurrent = evenCurrent.next;
}
oddCurrent.next = evenHead;
return head;
}
}