您的位置:首页 > 其它

交换链表当中两个节点

2016-07-13 09:53 459 查看

题目

给你一个链表以及两个权值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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: