交换链表中两个节点

给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
 注意事项
你需要交换两个节点而不是改变节点的权值
样例
给出链表 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;
       }
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值