5. 链表+逆序打印单向链表

方法很多啊

使用一个额外的栈

void reverse_print1(Node *head)
{
stack 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型的两个链表,那么两个链表的最后一个元素就是相同的。

你可能感兴趣的:(5. 链表+逆序打印单向链表)