演算法問題---兩兩交換連結串列中的節點
阿新 • • 發佈:2020-12-31
兩兩交換連結串列中的節點
給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
輸入:head = [1,2,3,4]
輸出:[2,1,4,3]
示例 2:
輸入:head = []
輸出:[]
示例 3:
輸入:head = [1]
輸出:[1]
解題思路是新建立一個連結串列,每次取一個偶數節點,在取一個奇數結點,新增到末尾,當連結串列是奇數結點個數時,最後一個直接新增到最後就可以了。
public ListNode swapPairs(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode pre1=head; //建立節點指向頭
ListNode pre2=head.next; //建立節點指向第一個元素
ListNode node1 = new ListNode(pre2.val);
ListNode link=node1; //新創一個連結串列變數
ListNode pre3=link;
ListNode node2 = new ListNode( pre1.val);
pre3.next=node2;
pre3=pre3.next;
while(pre2.next!=null && pre2.next.next!=null){ //判斷節點是否到達最後一個偶數節點
pre2=pre2.next.next; //讓節點指向間隔為2的下一個偶數元素
ListNode node3 = new ListNode(pre2.val); //建立節點 帶著當前的值
pre3. next=node3; //連線到新連結串列上
pre3=pre3.next; // 移動到下一位
pre1=pre1.next.next; //讓節點指向間隔為2的下一個奇數元素
ListNode node4 = new ListNode(pre1.val); //建立節點 帶著當前的值
pre3.next=node4 //連線到新連結串列上
pre3=pre3.next; // 移動到下一位
}
if(pre1.next.next!=null){ //如果是結點個數是奇數時需要把最後一個連線到最後
pre3.next=pre1.next.next;
}
return link;
}