方法很多啊
使用一个额外的栈
void reverse_print1(Node *head)
{
stack<Node> tmp;
Node *p_node=head;
while(p_node != nullptr)
{
tmp.push(p_node);
p_node=p_node->next;
}
while(!tmp.empty())
{
//打印
tmp.pop();
}
}
使用递归
void reverse_print2(Node *head)
{
if(head != nullptr)
{
reverse_print2(head->next);
//打印。
}
}
为什么网上的代码在if里面还要再判断next不是null?
翻转链表,再打印
改变了链表的结构,如果需要,再翻转回去。。。。
这种翻转法是不断的改变头部
void reverse_print3(Node *head)
{
if(head == nullptr)
{
return ;
}
//暂时的头部,刚开始是head
Node *tmp_head = head;
//将要处理的节点,是head->next;
Node *wait_change = head->next;
//head将作为指向wait_change 的指针,最后指向链表的最后一个节点。失去了原来的价值。
//上面的三个指针,每次都在变
while(wait_change != nullptr)
{
head->next = wait_change->next;
wait_change->next = tmp_head;
tmp_head=wait_change;
wait_change = head->next;
}
//最后tmp_head 是头部,wait_change 是尾部。head是最后一个节点;
//打印
//最后可以再翻转回去。
}
同样的翻转链表的方法还有,依次断开next,然后翻转。
这种翻转法是固定尾部不变,没有头部,到最后的时候才出现头部。
//head是头部
if(head == nullptr)
{
return;
}
//head用来暂存right后边的节点
Node *left = head;
Node *right = head->next;
while(right != nullptr)
{
head = right->next;
right->next=left;
right = head->next;
left = head;
}
return right;
单向链表删除中间每个节点
没有给定首节点
不能把该节点直接删除,因为没办法获取到指向该节点的指针。
将该节点指向的节点内容复制到该节点中,然后删除他的下一个节点。
此时,下一个节点被析构,指向该节点的指针或者是引用就不能再使用了。有问题的。
同时还需要判断他的下一个节点是不是空。
题这个题应该是不对的。无解的
寻找链表中的第k个元素
两个指针指向头部,然后一个指针先走k步,然后两个指针一起移动,一个指针到尾部的时候,另一个指针就是第K个节点了
判断链表是否存在环
两个指针一个指针每次走一步,另一个指针每次走两步。
如果两个指针在某一步相等,表示存在环。
如果一个指针到结尾,那表示不存在换。
判断两个链表是否相交
直接判断链表的最后一个元素是否相同。
如果相交,那么一定是y型的两个链表,那么两个链表的最后一个元素就是相同的。