单链表反转的两种方法

#include 
/*单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。
 * 比如一个链表是这样的: 1->2->3->4->5
 * 通过反转后成为5->4->3->2->1。
*/
using namespace std;
//链表
class List
{
  public:
    List(int data= 0):data(data)
    {
       next= nullptr;
    }
    int data;
    List *next;
};

void reverse(List * head,List *&temp)
{
  if(head->next == nullptr)
  {
     //若到了最后一个节点,让外面的head指向这最后一个
      temp = head;
      return;
  }
  //保存节点的下一个节点
  List *secondnext =head->next;
  //反转
  reverse(secondnext,temp);

  //返回后,改变相邻节点的方向
  secondnext->next = head;
  head->next = nullptr;
}
int main()
{
    List *head = new List();
    for(int i = 1;i < 6;i++ )
    {
        List *new_list = new List(i);
        //头插
        new_list->next = head->next;
        head->next = new_list;
    }
    //遍历下
    List *tmp1 = head->next;
    while(tmp1 != nullptr)
    {
        cout << tmp1->data << "  ";
        tmp1 = tmp1->next;
    }
    cout << endl;
    //方法1:试试反转 5->4->3->2->1
//    if(head->next == nullptr)
//        return 0;
//    List *pre,*current,*next;
//     pre = head->next;
//     current = head->next->next;
//     while(current)
//     {
//         next = current->next;
//         current->next = pre;
//         pre = current;
//         current = next;
//     }
//     head->next->next = nullptr;
//     head = pre;

//    tmp1 = head;
//    while(tmp1 != nullptr)
//    {
//        cout << tmp1->data << "  ";
//        tmp1 = tmp1->next;
//    }
    //方法2 :递归做法
    head = head->next;
   // List * &temp = head;
    reverse(head,head);

    tmp1 = head;
        while(tmp1 != nullptr)
        {
            cout << tmp1->data << "  ";
            tmp1 = tmp1->next;
        }

    return 0;
}

你可能感兴趣的:(单链表反转的两种方法)