zoukankan      html  css  js  c++  java
  • Partition List(链表的插入和删除操作,找前驱节点)

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

    You should preserve the original relative order of the nodes in each of the two partitions.

    For example,
    Given 1->4->3->2->5->2 and x = 3,
    return 1->2->2->4->3->5.

    思路:

    1.由于不能改变原来的相对位置,所以直接置换值是不行的。

    2.其实这个题类似于快速排序的Partition函数,该思路是,随机从数组中选取一个值作为参考值,使得数组中比该参考值小的数字排在参考值左端,数组中比该参考值大的数字排在参考值右端

    遍历所有节点,发现比x小的节点就”交换“,交换的过程即先删除那个节点,然后插入到对应位置。

    这里有一个前提,即若第一个数就小于x的话,是不需要“交换的”。

    另外一点需要注意的是:删除链表某个节点之后,指针p的值可能出现不定义状态,故在删除之前,先让p指向要删除节点的下一个节点。

     class Solution {
     public:
         //删除链表中位置为loc的节点,从1开始
         int Delete(ListNode* &head,int loc){
             ListNode* p=NULL;
             ListNode* q=NULL;
             p=head;
             int i=1;
             //找到前驱节点
             while(i<loc-1&&p->next){
                 ++i;
                 p=p->next;
             }
             q=p->next;
             p->next=q->next;
    
             int val=q->val;
             free(q);
             return val;
         }
         ListNode* Insert(ListNode* &head,int loc,int val){
             ListNode* p=head;
             p=head;
             int i=1;
             if(loc==1){
                 ListNode* s=(ListNode*)malloc(sizeof(ListNode));
                 s->val=val;
                 s->next=p;
                 return s;
             }
             //找到前驱节点
             while(i<loc-1&&p->next){
                 ++i;
                 p=p->next;
             }
             ListNode* s=(ListNode*)malloc(sizeof(ListNode));
             s->val=val;
             s->next=p->next;
             p->next=s;
             return head;
         }
         ListNode *partition(ListNode *head, int x) {
             if(head==NULL) return NULL;
             int insertloc=0;
             int loc=0;
             ListNode* p=head;
             while(p!=NULL)
             {
                 ++loc;
                 if(p->val<x)
                 {
                     ++insertloc;
                     if(insertloc!=loc){
                         p=p->next;
                         int val=Delete(head,loc);
                         head=Insert(head,insertloc,val);
                         continue;
                     }
                 }
                 p=p->next;
             }
             return head;
         }
     };
  • 相关阅读:
    HDU 1009 FatMouse' Trade
    HDU 2602 (简单的01背包) Bone Collector
    LA 3902 Network
    HDU 4513 吉哥系列故事——完美队形II
    LA 4794 Sharing Chocolate
    POJ (Manacher) Palindrome
    HDU 3294 (Manacher) Girls' research
    HDU 3068 (Manacher) 最长回文
    Tyvj 1085 派对
    Tyvj 1030 乳草的入侵
  • 原文地址:https://www.cnblogs.com/fightformylife/p/4176784.html
Copyright © 2011-2022 走看看