author openxmp@163.com
链表操作:
1) 插入
2) operator []
3) 翻转(递归)
4) 翻转(非递归)
5) 求长度
#include <iostream>
using namespace std;
#include <stdio.h>
template<typename T>
class List
{
//A template-parameter shall not be redeclared within its scope
//(including nested scopes). A template-parameter shall not have the same
//name as the template name.
template<typename U> friend List<U> * recursiveReverse ( List<U> * list );
template<typename U> friend List<U> * noneRecursiveReverse ( List<U> * list );
public:
List( );
List( T &value );
bool push_back( T &value );
T operator [] ( int index );
size_t getSize();
List *getHead( );
List *getTail( );
T getValue ();
void dump( );
public:
List *mFirstNode;
List *mNextNode;
T mValue;
};
template<typename U>
List<U> *
recursiveReverse ( List<U> * list )
{
static List<U> * firstNode = 0;
if ( 0 == list ->mNextNode )
{
list ->mFirstNode = list;
firstNode = list;
return list;
}
List<U> * node = recursiveReverse( list -> mNextNode );
list -> mNextNode->mNextNode = list;
list -> mNextNode = 0;
node -> mFirstNode = firstNode;
return node;
}
template<typename U>
List<U> * noneRecursiveReverse ( List<U> *list )
{
List<U> * recursiveHead = 0;
List<U> * nextNode = 0;
while ( list )
{
nextNode = list->mNextNode;
list->mNextNode = recursiveHead;
recursiveHead = list;
list = nextNode;
}
recursiveHead->mFirstNode = recursiveHead;
return recursiveHead;
}
template<typename T>
List<T>::List():mFirstNode(0),mNextNode(0)
{
}
template<typename T>
List<T>::List(T & value)
{
mValue = value;
}
template<typename T>
bool
List<T>::push_back( T & value )
{
if ( 0 == mFirstNode )
{
mFirstNode = this;
mNextNode = 0;
mValue = value;
return true;
}
List *node = new List( value );
if ( ! node )
{
return false;
}
node->mFirstNode = mFirstNode;
node->mNextNode = 0;
List *lastNode = mFirstNode;
while ( lastNode ->mNextNode )
{
lastNode = lastNode->mNextNode;
}
lastNode->mNextNode = node;
return true;
}
template<typename T>
T
List<T>::operator [] ( int index )
{
if ( index < 0 || index > getSize() )
{
return 0;
}
List *theNode = mFirstNode;
while ( theNode )
{
if ( 0 == index )
{
return theNode->mValue;
}
theNode = theNode ->mNextNode;
index --;
}
return 0;
}
template<typename T>
size_t
List<T>::getSize()
{
size_t retval = 0 ;
List * node = mFirstNode;
while ( node )
{
retval ++;
node = node ->mNextNode;
}
return retval;
}
template<typename T>
List<T> *
List<T>::getHead()
{
return mFirstNode;
}
template<typename T>
List<T> *
List<T>::getTail()
{
List * theNode = mFirstNode;
while ( theNode -> mNextNode )
{
theNode = theNode->mNextNode;
}
return theNode;
}
template<typename T>
T
List<T>::getValue()
{
return mValue;
}
template<typename T>
void
List<T>::dump()
{
List * node = mFirstNode;
cout << " start dump "<<endl;
while ( node )
{
fprintf(stderr,"[value %d] [address %p]\n",node->mValue,node);
node = node ->mNextNode;
}
cout << endl<< " dump finished " << endl;
}
void unitTest()
{
typedef List<int> INTLIST;
INTLIST intList ;
for (int i = 0; i < 10; ++i)
{
intList.push_back(i);
}
cout << "get Head "<< intList.getHead()->getValue()<<endl;
cout << "get Tail "<< intList.getTail()->getValue()<<endl;
INTLIST *reverseResult = recursiveReverse( & intList );
reverseResult->dump();
reverseResult = recursiveReverse(reverseResult);
reverseResult->dump();
reverseResult = noneRecursiveReverse(reverseResult);
reverseResult->dump();
}
int main()
{
unitTest();
return 0;
}
链表翻转
#include <iostream>
using namespace std;
struct Node
{
Node(int value):mValue(value),mNextNode(0)
{
}
int mValue;
Node *mNextNode;
};
Node *reverse(Node *input)
{
Node *retval = 0;
Node *nextNode = 0;
while ( input )
{
nextNode = input->mNextNode;
input ->mNextNode = retval;
retval = input;
input = nextNode;
}
return retval;
}
void PrintNode ( Node * head )
{
while ( head )
{
cout << head->mValue<<endl;
head = head->mNextNode;
}
}
int main(int argc, char const *argv[])
{
Node *head = 0;
Node *currentNode = head;
for (int i = 0; i < 10; ++i)
{
Node *tmpNode = new Node(i);
if ( 0 == i )
{
currentNode = tmpNode;
head = tmpNode;
continue;
}
currentNode->mNextNode = tmpNode;
currentNode = tmpNode;
}
Node *reverseNode = reverse(head);
PrintNode(reverseNode);
return 0;
}