分割单链表

1. 将单链表按某个基准划分。编写一个程序,以给定值x为基准将单链表分割为两部分,所有小于x的结点排在大于或等于x的结点之前。并分析时间复杂度。

LinkedList.h

#include<iostream>
#include<stdlib.h>
using namespace std;


template<class T>
struct LinkNode
{
   T data;
   LinkNode<T> *link;
   LinkNode(LinkNode<T> *ptr=NULL)
   {
       link=ptr;
   }
   LinkNode(const T &item, LinkNode<T> *ptr=NULL)
   {
       data=item;
       link=ptr;
   }
};


template<class T>
class List
{
protected:
    LinkNode<T> *first;
public:
    List()
    {
        first=new LinkNode<T>;
    }
    List(const T &x)
    {
        first=new LinkNode<T>(x);
    }
    List(List<T> &L);
    ~List()
    {
        makeEmpty();
    }
    void makeEmpty();
    int Length() const;
    LinkNode<T> *getHead() const
    {
        return first;
    }
    LinkNode<T> *Search(T x);
    LinkNode<T> *Locate(int i) const;
    bool getData(int i,T &x) const;
    void setData(int i,T &x);
    bool Insert(int i,T &x);
    bool Remove(int i,T &x);
    bool IsEmpty() const
    {
        return(first->link==NULL)?true:false;
    }
    bool IsFull() const
    {
        return false;
    }
    void output();
    List<T> &operator=(List<T> &L);
};


template<class T>
List<T>::List(List<T> &L)
{
    T value;
    LinkNode<T> *srcptr=L.getHead();
    LinkNode<T> *desptr=first=new LinkNode<T>;
    while(srcptr->link!=NULL)
    {
        value=srcptr->link->data;
        desptr->link=new LinkNode<T>(value);
        desptr=desptr->link;
        srcptr=srcptr->link;
    }
}


template<class T>
void List<T>::makeEmpty()
{
    LinkNode<T> *q;
    while(first->link!=NULL)
    {
        q=first->link;
        first->link=q->link;
        delete q;
    }
}


template<class T>
int List<T>::Length() const
{
    LinkNode<T> *p=first->link;
    int count=0;
    while(p!=NULL)
    {
        count++;
        p=p->link;
    }
    return count;
}


template<class T>
LinkNode<T> *List<T>::Search(T x)
{
    LinkNode<T> *current;
    current=first->link;
    while(current!=NULL)
    {
        if(current->data==x)
            break;
        else
            current=current->link;
    }
    return current;
}


template<class T>
LinkNode<T> *List<T>::Locate(int i) const
{
    if(i<0)
        return NULL;
    LinkNode<T> *current=first;
    int k=0;
    while(current!=NULL&&k<i)
    {
        current=current->link;
        k++;
    }
    return current;
}


template<class T>
bool List<T>::getData(int i,T &x) const
{
    if(i<0)
        return NULL;
    LinkNode<T> *current=Locate(i);
    if(current==NULL) return false;
    else
    {
        x=current->data;
        return true;
    }
}


template<class T>
void List<T>::setData(int i,T &x)
{
    if(i<0)
        return;
    LinkNode<T> *current=Locate(i);
    if(current==NULL)
        return;
    else
        current->data=x;
}


template<class T>
bool List<T>::Insert(int i,T &x)
{
    LinkNode<T> *current=Locate(i);
    if(current==NULL)
        return false;
    LinkNode<T> *newNode=new LinkNode<T>(x);
    if(newNode==NULL)
    {
        cerr<<"´æ´¢·ÖÅä´íÎó£¡"<<endl;
        exit(1);
    }
    newNode->link=current->link;
    current->link=newNode;
    return true;
}


template<class T>
bool List<T>::Remove(int i,T &x)
{
    LinkNode<T> *current=Locate(i-1);
    if(current==NULL||current->link==NULL)
        return false;
    LinkNode<T> *del=current->link;
    x=del->data;
    current->link=del->link;
    delete del;
    return true;
}


template<class T>
void List<T>::output()
{
    LinkNode<T> *current=first->link;
    while(current!=NULL)
    {
        cout<<current->data<<' ';
        current=current->link;
    }
}


template<class T>
List<T> &List<T>::operator=(List<T> &L)
{
    T value;
    LinkNode<T> *srcptr=L.getHead();
    LinkNode<T> *desptr=first=new LinkNode<T>;
    while(srcptr->link!=NULL)
    {
        value=srcptr->link->data;
        desptr->link=new LinkNode<T>(value);
        desptr=desptr->link;
        srcptr=srcptr->link;
    }
    desptr=NULL;
    return *this;

}


main.cpp

#include<iostream>
#include"LinkedList.h"
using namespace std;


LinkNode<int> *partition(LinkNode<int> *node,int x);


int main()
{
    List<int> H;
    int a=9;
    int b=8;
    int c=0;
    int d=1;
    int e=6;
    int f=4;
    int g=5;
    H.Insert(0,a);
    H.Insert(1,b);
    H.Insert(2,c);
    H.Insert(3,d);
    H.Insert(4,e);
    H.Insert(5,f);
    H.Insert(6,g);


    cout<<"原单链表如下:";
    H.output();
    cout<<endl;
    LinkNode<int> *node=H.getHead();
    node=node->link;
    LinkNode<int> *node2=partition(node,5);
    List<int> H2;
    H2.getHead()->link=node2;
    cout<<"现单链表如下:";
    H2.output();
    cout<<endl;


    return 0;
}


LinkNode<int> *partition(LinkNode<int> *node,int x)
{
    if(node==NULL)
        return NULL;
    LinkNode<int> *beforeStart=NULL;
    LinkNode<int> *beforeEnd=NULL;
    LinkNode<int> *afterStart=NULL;
    LinkNode<int> *afterEnd=NULL;


    while(node!=NULL)
    {
        LinkNode<int> *l=node->link;
        node->link=NULL;
        if(node->data<x)
        {
            if(beforeStart==NULL)
            {
                beforeStart=node;
                beforeEnd=beforeStart;
            }
            else
            {
                beforeEnd->link=node;
                beforeEnd=node;
            }
        }
        else
        {
            if(afterStart==NULL)
            {
                afterStart=node;
                afterEnd=afterStart;
            }
            else
            {
                afterEnd->link=node;
                afterEnd=node;
            }
        }
        node=l;
    }
        if(beforeStart==NULL)
            return beforeStart;
        beforeEnd->link=afterStart;
        return beforeStart;

}


猜你喜欢

转载自blog.csdn.net/qq_38628659/article/details/80267242
今日推荐