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;
}