LintCode:交换链表当中两个节点

给你一个链表以及两个权值v1v2,交换链表中权值为v1v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。

 注意事项

你需要交换两个节点而不是改变节点的权值

样例

给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4
返回结果 1->4->3->2->null

标签 

链表


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    /**
     * @param head a ListNode
     * @oaram v1 an integer
     * @param v2 an integer
     * @return a new head of singly-linked list
     */
    ListNode* swapNodes(ListNode* head, int v1, int v2) {
        // Write your code here
        ListNode* plist = head;
        ListNode* p1r=NULL,*p2r=NULL,*p1n=NULL, *p2n=NULL;
        ListNode* p1 = NULL, *p2 = NULL;
        if(head==NULL)
           return head;
       
        ListNode* pr = NULL;
        while(plist != NULL)
        {
           if(plist->val == v1 || plist->val == v2)
           {
              if(p1 == NULL)//前一个节点
              {
                  p1r = pr;
                  p1 = plist;
              }
              else  //后一个节点
              {
                  p2r = pr;
                  p2  = plist;
                  p2n = p2->next;
                    
                  if(p1->next == p2)//两个节点连续
                  {
                     p1->next = p2->next;
                     p2->next = p1;
                     if(p1r != NULL)//如果第一个节点不是头节点
                          p1r->next = p2;
                     else  
                          return p2;//第一个节点是头节点,返回p2
                  }
                  else
                  {
                     if(p1r != NULL)//如果第一个节点不是是头节点
                          p1r->next = p2;
                     p2->next = p1->next; //交换节点需要用到两个节点指针以及他们前一节点指针
                     p2r->next = p1;      //还需要其中一个后面的指针
                     p1->next = p2n;
                        
                     if(p1r == NULL)
                          return p2;//第一个节点是头节点,返回p2
                  }
                  return head; //交换之后直接返回
               }
           }
           pr = plist;
           plist = plist->next;
        }
        return head;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值