1. 程式人生 > 其它 >演算法問題---兩兩交換連結串列中的節點

演算法問題---兩兩交換連結串列中的節點

兩兩交換連結串列中的節點

給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。在這裡插入圖片描述

輸入: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; }