先来讨论逆序打印的问题:
逆序打印:
所谓逆序打印,就是先打印整个链表的最后一个节点,故此可以使用一个栈,只要节点存在就一直入栈,当所有的节点都入栈后,此时最后一个节点就在栈顶了,然后一次pop()即可。
代码实现:
void PrintTailToHead(Node* Head)
{
if(Head == NULL)
return;
stack<Node*> s;
Node* cur = Head;
while(cur){
s.push(cur);
cur = cur->_next;
}
//逆序打印
while(!s.empty()){
Node* top = s.top();
printf("%d->",top->_data);
s.pop();
}
}
思考,既然是一直向栈里面push,那就是一个压栈的过程,自然而然的想到递归本身就是一个压栈的过程,故可以写出一个很精简的代码。
void PrintTailToHeadR(Node* Head)
{
if(Head != NULL){
if(Head->_next != NULL){
PrintTailToHeadR(Head->_next);
}
printf("%d->",Head->_data);
}
}
逆置单链表
比起逆置,逆序打印要简单,因为不用改变链表的结构。
Node* ReverseList(Node* Head)
{
if(Head == NULL)
return NULL;
Node* pre = NULL;
Node* cur = Head;
Node* newHead = NULL;
while(cur){
Node* Next = cur->_next;
//cur是最后一个节点,即新链表的头
if(cur->_next == NULL)
newHead = cur;
cur->_next = pre;
pre = cur;
cur = Next;
}
return newHead;
}
文中代码是手打的,不是复制粘贴过来的,如果错误望指正,第一时间回复。