题意理解
将一个链表的中奇数位置的结点提前,偶数位置的结点后移,组成新的链表,要求时间复杂度O(n),空间复杂度O(1)。
问题分析
双指针法
遍历的过程解释:
初始值,奇数结点
终止条件:偶数结点,偶数结点的下一个结点都存在。
遍历中操作:奇数链表增加,偶数链表增加,奇数链当前指针后移,偶数链当前指针后移
其他
链接
ListNode* oddEvenList(ListNode* head) {
if(!head) //空链表
return head; //直接返回
ListNode* odd = head, *evenhead = head -> next, *even = evenhead; //奇数链当前结点,偶数链头结点,偶数链当前结点
while(even && even -> next) //偶数链当前结点存在,当前结点的后一个结点也存在
{
odd -> next = even -> next; //奇数链追加一个结点
even -> next = even -> next -> next; //偶数链追加一个结点
odd = odd -> next; //奇数链当前结点后移
even = even -> next; //偶数链当前结点后移
}
odd -> next = evenhead; //奇数链连接到偶数链头部,组成新的链表
return head;
}