您的位置:首页 > 职场人生

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

2016-12-06 12:33 225 查看
给你一个链表以及两个权值
v1
v2
,交换链表中权值为
v1
v2
的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。


 注意事项


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

您在真实的面试中是否遇到过这个题? 

Yes

样例

给出链表 
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;

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 链表 面试