題目:給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裏的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。
解析:
①新建兩個鏈表結點p1和p2分別連接單鏈表中奇數結點和偶數結點;
②定義計數count,遍歷鏈表,如果當前結點計數count爲奇數,將該節點連接到p1後,如果該當前結點計數爲偶數,將該節點連接到p2後;
③鏈表遍歷完成後,p1和p2後分別掛着奇數結點和偶數結點;
④將p1的末結點接上p2後的偶數結點。
public ListNode oddEvenList(ListNode head) {
if (head==null||head.next==null||head.next.next==null)
return head;
ListNode p1 = new ListNode(-1);//存儲奇數結點
ListNode p2 = new ListNode(-1);//存儲偶數結點
ListNode tmp1 = p1, tmp2 = p2;
//遍歷鏈表
int count = 0;
while(head != null){
++count;//結點的奇偶計數
if(count%2 != 0){
//如果是奇數結點,將結點掛在p1後面
p1.next = head;
p1 = p1.next;
}else{
//如果是偶數結點,將結點掛在p2後面
p2.next = head;
p2 = p2.next;
}
head = head.next;
}
//遍歷完成後p1上奇數結點的末節點掛上p2上的偶數頭結點
p1.next = tmp2.next;
//將p2上的偶數末尾節點的next指針賦值null
p2.next = null;
return tmp1.next;
}