交换链表当中两个节点
题目:
描述
给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
你需要交换两个节点而不是仅仅交换节点的权值
样例
样例 1:
输入: 1->2->3->4->null, v1 = 2, v2 = 4
输出: 1->4->3->2->null
样例 2:
输入: 1->null, v1 = 2, v2 = 1
输出: 1->null
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: a ListNode
* @param 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
if(head == null) {
return null;
}
ListNode root = new ListNode(0);
root.next = head;
ListNode n1 = null, n2 = null, pr = root;
ListNode p1 = null, p2 = null, cur = head;
while(cur != null) {
if(cur.val == v1 || cur.val == v2) {
if(p1 == null) {
p1 = pr;
n1 = cur;
} else if(p2 == null) {
p2 = pr;
n2 = cur;
}
}
pr = cur;
cur = cur.next;
}
if(n1 == null || n2 == null) {
return head;
}
if(p2 == n1) {
ListNode tmp = n2.next;
p1.next = n2;
n2.next = n1;
n1.next = tmp;
} else {
ListNode tmp = n1.next;
n1.next = n2.next;
p2.next = n1;
n2.next = tmp;
p1.next = n2;
}
// System.out.println("p1: " + p1.val);
// System.out.println("n1: " + n1.val);
// System.out.println("p2: " + p2.val);
// System.out.println("n2: " + n2.val);
return root.next;
}
}