前段时间一直在忙着找工作,在面试中也遇到了大量的算法题目。当中。问的比較多的是二叉树和链表之类的题目。在这里。我就把前段时间写的链表面试题贴出来,当然,由于题目非常多。我仅仅是在这里贴出它的类构造,不贴出实现的代码,​​

      假设由于其它别的原因下载不下来的话,留下你的邮箱。我会给你传一份。

      好吧,以下贴出链表算法类:

template <typename T>
class dutNode
{
public :
T data;
dutNode<T>* next;

dutNode() : data(T()), next(NULL) {}
dutNode(const T& _data) : data(_data) {}
dutNode(const T& _data, dutNode<T>* _next) : data(_data), next(_next) {}
};

template <typename T>
class dutLinkList
{
private :
int count;
dutNode<T>* pHead;

protected: /*包裹函数*/
dutNode<T>* dutRecursionReverseList(dutNode<T>*);
void dutReversePrintList(dutNode<T>*);
void dutQuickSortByPointer(dutNode<T>* &, dutNode<T>* &);
dutNode<T>* dutReverseOddAndEven(dutNode<T>*);
dutNode<T>* dutRecursionMergeSortedList(dutNode<T>*, dutNode<T>*);
dutNode<T>* dutNotRecursionMergeSortedList(dutNode<T>*, dutNode<T>*);
dutNode<T>* dutFindBackwardsK(dutNode<T>*, int);
dutNode<T>* dutFindMiddleElement(dutNode<T>*);
bool dutHasCircle(dutLinkList<T>& ,dutNode<T>* &);

void dutSwapData(T&, T&);

public:
dutLinkList();
~dutLinkList();

/*normal operation*/
void dutPrintList() const;

bool dutIsEmpty() const;
int dutGetCount() const;

int dutAddToListByArray(const T*, int);
int dutAddToHead(const T&);
int dutAddToTail(const T&);
int dutAddNodeToHead(dutNode<T>*);
int dutAddNodeToTail(dutNode<T>*);
int dutAddNodeAfterData(dutNode<T>*, T);

void dutRemoveFirst();
void dutRemoveTail();
void dutRemoveAll();
void dutRemoveData(const T&);

/*algotithm*/
bool dutFindNodeByData(const T&) const; /*链表中是否存在给定值*/
void dutNotRecursionReverseList(); /*非递归翻转单链表*/
void dutRecursionReverseList(); /*递归翻转单链表*/
void dutReversePrintList(); /*倒序打印单链表*/
void dutSelectSortByData(); /*通过交换数据对单链表运行选择排序*/
void dutInsertSortByPointer(); /*通过交换指针对单链表运行插入排序*/
void dutQuickSortByPointer(); /*通过交换指针对单链表运行高速排序*/
void dutMergeList(dutLinkList<T>&); /*合并单链表*/
void dutNotRecursionMergeSortedList(dutLinkList<T>&); /*非递归合并有序单链表*/
void dutRecursionMergeSortedList(dutLinkList<T>&); /*递归合并有序单链表*/
void dutReverseOddAndEven(); /*翻转链表中奇数和偶数序号节点*/
void dutSplitListMakeOddSeqBeforeEvenSeq(); /*切割单链表使得奇数序号位于偶数序号之前*/
void dutSplitListMakeOddDataBeforeEvenData(); /*切割单链表使得奇数数据位于偶数数据之前*/
void dutFindBackwardsK(int); /*输出倒数第K个节点*/
void dutFindMiddleElement(); /*输出中间节点*/
bool dutHasCircle(); /*链表中是否存在环*/
bool dutListIntersect(dutLinkList<T>&); /*链表是否相交*/
bool dutListHasCircleAndIntersect(dutLinkList<T>&); /*链表是否有环且相交*/
void dutFindLoopPort(); /*输出链表环的入口*/
void dutFindTheFirstIntersectNode(dutLinkList<T>&); /*输出相交链表的第一个相交节点*/
};