剑指offer 24. 反转链表

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;
    }
};

 

你可能感兴趣的:(剑指offer)