1. 程式人生 > >Java實現-交換連結串列當中的兩個節點

Java實現-交換連結串列當中的兩個節點

給你一個連結串列以及兩個權值v1v2,交換連結串列中權值為v1v2的這兩個節點。保證連結串列中節點權值各不相同,如果沒有找到對應節點,那麼什麼也不用做。

 注意事項

你需要交換兩個節點而不是改變節點的權值

您在真實的面試中是否遇到過這個題?  Yes 樣例

給出連結串列 1->2->3->4->null ,以及 v1 = 2 , v2 = 4

返回結果 1->4->3->2->null

/**
 * 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) {
       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){
			ListNode t=node1Prev;
			node1Prev=node2Prev;
			node2Prev=t;
		}
		ListNode node1=node1Prev.next;
		ListNode node2=node2Prev.next;
		if(node1Prev.next==node2Prev){
			node1Prev.next=node2;
			node1.next=node2.next;
			node2.next=node1;
		}else{
			node1Prev.next=node1.next;
			node2Prev.next=node2.next;
			node2.next=node1Prev.next;
			node1Prev.next=node2;
			node1.next=node2Prev.next;
			node2Prev.next=node1;
		}
		return dummy.next;

    }
}