给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
注意事项
你需要交换两个节点而不是改变节点的权值
样例
给出链表 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
* @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
ListNode l1=head;//找到的第一个节点
ListNode l2=head;//找到的第二个节点
ListNode first=new ListNode(0);//给整个链表加一个头,好操作
first.next=head;
ListNode pre1=first;//l1的前驱
ListNode pre2=first;//l2的前驱
int n1=0,n2=0;//这两个记录 l1和l2谁在前面。
while(l1!=null && l1.val!=v1 ){
l1=l1.next;
pre1=pre1.next;
n1++;
}
while(l2!=null && l2.val!=v2){
l2=l2.next;
pre2=pre2.next;
n2++;
}
if(l1==null ||l2==null){//只要有一个没找到,就什么都不做
return head;
}
if(pre2==l1){//两个节点相邻的时候,l1在前面
pre1.next=l2;
l1.next=l2.next;
l2.next=l1;
return first.next;
}
if(pre1==l2){//两个节点相邻的时候,l2在前面
pre2.next=l1;
l2.next=l1.next;
l1.next=l2;
return first.next;
}
if(n1<n2){//不是相邻的时候,l1在前面
ListNode temp=l1.next;
l1.next=l2.next;
pre2.next=l1;
l2.next=temp;
pre1.next=l2;
return first.next;
}
if(n1>n2){//不是相邻的时候,l2在前面
ListNode temp=l2.next;
l2.next=l1.next;
pre1.next=l2;
l1.next=temp;
pre2.next=l1;
return first.next;
}
return first.next;
}
}
交换时候的具体操作,画一画就清楚了。