LintCode 交换链表当中两个节点

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

交换时候的具体操作,画一画就清楚了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值