给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
思路:把链表按照奇偶位置拆成两条,如题就是拆成1->3和2->4,然后偶奇顺序,重新拼接。
class Solution {
public ListNode swapPairs(ListNode head) {
//先按照位置的奇偶拆分成两条链表,再重新合并
boolean odd = true;
if(head==null||head.next==null){
return head;
}
//奇数链表
ListNode oddPre = new ListNode(-1);
//偶数链表
ListNode evenPre = new ListNode(0);
ListNode oddCurr = oddPre;
ListNode evenCurr = evenPre;
ListNode curr = head;
while(curr!=null){
if(odd){
oddCurr.next = curr;
oddCurr = oddCurr.next;
odd = false;
}else {
evenCurr.next = curr;
evenCurr = evenCurr.next;
odd = true;
}
curr = curr.next;
}
//去掉最后位置上多余的尾巴
if(odd==false){
evenCurr.next = null;
}else {
oddCurr.next = null;
}
odd = false;
ListNode pre = new ListNode(0);
ListNode ansCurr = pre;
//重新拼接
while(oddPre.next!=null&&evenPre.next!=null){
if(odd){
ListNode temp = new ListNode(oddPre.next.val);
ansCurr.next = temp;
oddPre = oddPre.next;
odd = false;
}else {
ListNode temp = new ListNode(evenPre.next.val);
ansCurr.next = temp;
evenPre = evenPre.next;
odd = true;
}
ansCurr = ansCurr.next;
}
if(oddPre.next==null){
ansCurr.next = evenPre.next;
}
if(evenPre.next==null){
ansCurr.next = oddPre.next;
}
return pre.next;
}
}
网友评论