トピック:
隣接ノードとのリストのペアごとの交換を考えると、交換にリストを返します。
あなたは、単に内部ノードの値を変更することはできませんが、実際のノード交換する必要があります。
例:
考えると1->2->3->4
、あなたは返す必要があります2->1->4->3
。
この問題は簡単なデジタル交換のではなく、ノード間の交換。
コードは以下の通りであります:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode swapPairs(ListNode head) { ListNode tmp = new ListNode( 0 ); //申请一个空的节点 tmp.next = head; //让链表的头节点指向那个空节点的下一个节点 ListNode temp = tmp; //把这个空节点保存下来,用这个变量去完成交换 while (head != null && head.next != null ){ temp.next = head.next; head.next = temp.next.next; temp.next.next = head; temp = temp.next.next; //当上面交换完了后,temp向后移两个节点。 head = temp.next; } return tmp.next; //返回空节点之后已经交换完了的链表 } } |
アクトII:
ノードは、再帰によって実現2つの2の交換を、一枚ずつ取り出し、
コードは以下の通りであります:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode swapPairs(ListNode head) { if (head == null || head.next == null ){ return head; } ListNode res = head.next; //找到交换节点的下一个 ListNode temp = swapPairs(head.next.next); //需要移动头部 res.next = head; //交换 head.next = temp; //头部移动到下一组 return res; } } |