一个链表的结点结构:
struct Node
{
int data;
Node *next;
};
typedef struct Node Node;
(1)已知链表的头结点head,写一个函数把这个链表逆序
template <class T>
void Chain<T>::Reverse()
{
if (head == NULL || head->Next == NULL)
return;
ChainNode<T> *pTemp1 = head; //暂存第一个结点
ChainNode<T> *pNode = head->Next; //用来遍历整个链表
ChainNode<T> *pTemp2 = head->Next; //用来暂存第三个结点
pTemp1->Next = NULL;
while (pNode->Next)
{
pTemp2 = pNode->Next;
pNode->Next = pTemp1;
pTemp1 = pNode;
pNode = pTemp2;
}
pNode->Next = pTemp1;
head = pNode;
}
由于要将链表遍历一遍,所以时间复杂度为n(n为链表长度)
(2)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)//已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序
//template<class T>
ChainNode<int> * Merge(ChainNode<int> *head1, ChainNode<int> *head2)
{
if (head1 == NULL)
return head2;
if (head2 == NULL)
return head1;
ChainNode<int> *p1 = head1;
ChainNode<int> *p2 = head2;
ChainNode<int> *newhead = new ChainNode < int >;
if (p1->Data <= p2->Data)
{
newhead = p1;
p1 = p1->Next;
}
else
{
newhead = p2;
p2 = p2->Next;
}
ChainNode<int> *pNode = newhead; //新链表指示器
while (p1 != NULL && p2 != NULL)
{
ChainNode<int> *nNode = new ChainNode < int >; //新结点
if (p1->Data <= p2->Data)
{
nNode = p1;
p1 = p1->Next;
}
else
{
nNode = p2;
p2 = p2->Next;
}
pNode->Next = nNode;
pNode = pNode->Next;
}
if (p1 != NULL)
pNode->Next = p1; //这一步很巧
else
pNode->Next = p2;
return newhead;
}
有个问题:当析构原先两个链表时如果删除结点,会报错
时间复杂度:n1+n2