题目:已知一个带有附加头节点的单链表,节点结构为(data,link)。假设该链表只给出了头指针first。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第i个位置上的节点,若查找成功,算法返回该节点的地址;否则返回NULL。
分析:用一个指针p指向链表的首节点,另一个指针q找到链表正数第i个节点,然后平移指针p和指针q,当指针q指向链表最后一个节点时,指针p恰好指向链表倒数第i个节点。算法思路如下图(查找倒数第二个节点)
源码:
template<class T> LinkNode<T>* List<T>::oppoLocate(int i)//返回表中倒数第i个元素的地址 { if(i<0) return NULL; //i不合理 LinkNode<T>* p = first->link; //p指向首节点 LinkNode<T>* q = Locate(i); //q指向正数第i个节点 while(q->link!=NULL) //偱链至q指向最后一个节点 { p = p->link; q = q->link; } return p; //返回p所指向的倒数第i个结点地址 }; template<class T> LinkNode<T>* List<T>::Locate(int i) //返回链表中正数第i个元素的地址 { if(i<0) return NULL; //i不合理 LinkNode<T>* current = first; int k = 0; while(current!=NULL && k<i) //偱链找第i个结点 { current=current->link; k++; } return current; //返回第i个结点地址,若返回NULL,表示i值太大 };
上述算法的时间复杂度为O(n),且只需遍历链表一次