欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

剑指offer 24. 反转链表

程序员文章站 2022-03-11 17:24:12
...

1.问题描述

输入一个链表的头结点,反转链表后,输出新链表的表头。

2. 解决思路

  1)链表是空的:直接返回空的头结点;

  2)链表中只有一个结点:直接返回原头结点;

  3)链表中有大于2个以上的结点:需要三个指针来辅助

    a)头结点的下一个结点为空结点NULL;

    b)要对每个结点逐一遍历并反转,需要辅助指针node1来遍历;

    c)由于需要改变每个结点的下一个结点,所以在改变方向之前需要保存它的下一个结点,使用node2;

    d)node1和node2每次都需要更新,指向原来链表的下一个,但是它们指向的下一个已经发生了改变,所以需要临时的变量node3来辅助它们更新;是否更新就看node2是否到了最后一个。

   e)返回node1即为新的链表表头。

3.代码实现

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* head) {
        if(head == NULL || head->next == NULL)
            return head;
        ListNode* node1;
        ListNode* node2;
        node1 = head->next;
        head->next = NULL;
        node2 = node1->next;       
        node1->next = head;
        while(node2 != NULL){
            ListNode* node3 = node2->next;
            node2->next = node1;
            node1 = node2;
            node2 = node3;
            
        }
        return node1;
    }
};