[LeetCode]206. Reverse Linked List(反转单链表)

来源:互联网 发布:linux和windows双系统 编辑:程序博客网 时间:2024/05/14 00:55

206. Reverse Linked List

Reverse a singly linked list.
反向单链表。
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?
提示:
可以迭代或递归地颠倒链表

思路1:

  • 现将链表变成环,每次都将原第一个结点之后的那个结点放在新的表头后面,最后断开环。
  • 比如1,2,3,4,5 变成1,2,3,4,5->1(环)
  • 第一次:把第一个结点1后边的结点2放到新表头后面,变成2,1,3,4,5 ->2(环)
  • 第二次:把第一个结点1后边的结点3放到新表头后面,变成3,2,1,4,5 ->3(环)
  • 4,3,2,1,5 ->4(环)
  • 5,4,3,2,1 ->5(环)

    代码如下:

ListNode* reverseList(ListNode* head) {        if(head == nullptr || head->next == nullptr)            return head;        ListNode* res;        ListNode* first;        ListNode* temp;        res = new ListNode(-1);        res->next = head; //将单链表变成环        first = head;//指向原链表的头结点        while(first->next != nullptr){            temp = first->next;//指向即将处理的点            first->next = temp->next;            temp->next = res->next;            res->next = temp;        }        head = res->next;        res->next = nullptr;        return head;    }

思路2:

  • 参考了网上别人写的方法,点击查看

代码如下:

ListNode* reverseList(ListNode* head) {        if(head == nullptr || head->next == nullptr)            return head;        ListNode* p;        ListNode* q;        ListNode* r;        p = head;        q = head->next;        head->next = nullptr;//旧的头指针是新的尾指针 指向NULL        while(q){            r = q->next;//用来保存下一步要处理的指针            q->next = p;//p q 交替处理 进行反转单链表            p = q;            q = r;        }        head = p;//最后的q必定指向NULL,p就成了新链表的头指针        return head;    }

思路3:

  • 递归,参考链接
  • 现在需要把A->B->C->D进行反转,
  • 可以先假设B->C->D已经反转好,已经成为了D->C->B,那么接下来要做的事情就是将D->C->B看成一个整体,让这个整体的next指向A,所以问题转化了反转B->C->D。那么,
  • 可以先假设C->D已经反转好,已经成为了D->C,那么接下来要做的事情就是将D->C看成一个整体,让这个整体的next指向B,所以问题转化了反转C->D。那么,
  • 可以先假设D(其实是D->NULL)已经反转好,已经成为了D(其实是head->D),那么接下来要做的事情就是将D(其实是head->D)看成一个整体,让这个整体的next指向C,所以问题转化了反转D。

代码如下:

ListNode* reverseList(ListNode* head) {        if (!head || !(head -> next)) return head;        ListNode* node = reverseList(head -> next);        head -> next -> next = head;        head -> next = NULL;        return node;     }
0 0