1. 程式人生 > >交換連結串列當中兩個節點

交換連結串列當中兩個節點

題目

給你一個連結串列以及兩個權值v1和v2,交換連結串列中權值為v1和v2的這兩個節點。保證連結串列中節點權值各不相同,如果沒有找到對應節點,那麼什麼也不用做。
注意事項
你需要交換兩個節點而不是改變節點的權值

解題

找到這兩個結點的前驅節點
node1Prev node1
node2Prev node2 node2Next
利用上面五個結點進行連結
node1Prev.next = node2;
node2.next = node1.next;
node2Prev.next = node1;
node1.next = node2Next;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution { /** * @param head a ListNode * @oaram v1 an integer * @param v2 an integer * @return a new head of singly-linked list */ public ListNode swapNodes(ListNode head, int v1, int v2) { // Write your code here ListNode dummy = new ListNode(0
);// 新增頭結點 dummy.next = head; ListNode node1Prev = null, node2Prev = null; ListNode cur = dummy; while (cur.next != null) { if (cur.next.val == v1) { node1Prev = cur; } else if (cur.next.val == v2) { node2Prev = cur; } cur = cur.next; } if
(node1Prev == null || node2Prev == null) { return head; } if (node2Prev.next == node1Prev) { // 連結情況 // make sure node1Prev is before node2Prev ListNode t = node1Prev; node1Prev = node2Prev; node2Prev = t; } ListNode node1 = node1Prev.next; ListNode node2 = node2Prev.next; ListNode node2Next = node2.next; if (node1Prev.next == node2Prev) { node1Prev.next = node2; node2.next = node1; node1.next = node2Next; } else { node1Prev.next = node2; node2.next = node1.next; node2Prev.next = node1; node1.next = node2Next; } return dummy.next; } }