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

来源:互联网 发布:linux的认识和理解 编辑:程序博客网 时间:2024/05/16 08:22

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

0 0
原创粉丝点击