给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
注意事项
你需要交换两个节点而不是改变节点的权值
样例
给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4
注意事项
你需要交换两个节点而不是改变节点的权值
样例
给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4
返回结果 1->4->3->2->null。
import java.util.Scanner;
/**
* 给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
注意事项
你需要交换两个节点而不是改变节点的权值
样例
给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4
返回结果 1->4->3->2->null。
*
* @author Dell
*
*/
public class Test511 {
public static ListNode swapNodes(ListNode head, int v1, int v2)
{
if(head==null||head.next==null||v1==v2)
return head;
ListNode temp=new ListNode(-1);
temp.next=head;
ListNode p=find(temp,v1);
ListNode q=find(temp,v2);
ListNode r1=null;
ListNode r2=null;
if(p!=null&&q!=null)
{
if(p.next==q)
{
ListNode r =q.next;
p.next=r;
q.next=null;
q.next=r.next;
r.next=q;
}
else if(q.next==p)
{
ListNode r =p.next;
q.next=r;
p.next=null;
p.next=r.next;
r.next=p;
}
else
{
r1=p.next;
r2=q.next;
p.next=r1.next;
q.next=r2.next;
r1.next=null;
r2.next=null;
r2.next=p.next;
p.next=r2;
r1.next=q.next;
q.next=r1;
}
}
return temp.next;
}
public static ListNode find(ListNode temp, int target)
{
ListNode p=temp;
while(p.next!=null&&p.next.val!=target)
{
p=p.next;
}
if(p.next==null)
return null;
else
{
return p;
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
ListNode list=new ListNode(-1);
ListNode p=list;
for(int i=0;i<n;i++)
{
ListNode temp=new ListNode(sc.nextInt());
p.next=temp;
p=p.next;
}
int v1=sc.nextInt();
int v2=sc.nextInt();
ListNode result=null;
result=swapNodes(list.next, v1,v2);
ListNode q=result;
while(q!=null)
{
System.out.print(q.val+" ");
q=q.next;
}
}
}