欢迎来到我的博客https://www.cnblogs.com/veis/

https://www.cnblogs.com/veis/p/14182037.html

经典链表翻转(C/C++)

题目

1、描述
输入一个链表,反转链表后,输出新链表的表头。

2、示例
输入:

输出:

思路

1、初始化:3个指针
(1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向nullptr
(2)cur指针指向待反转链表的第一个节点,最开始第一个节点待反转,所以指向head
(3)nex指针指向待反转链表的第二个节点,目的是保存链表,因为cur改变指向后,后面的链表则失效了,所以需要保存

2、接下来,循环执行以下三个操作,改变链表指向3
(1)保存下一个节点
p_next = p_cur->next;
(2)未反转链表的第一个节点的下个指针指向已反转链表的最后一个节点
p_cur->next = p_pre;
(3)节点后移
p_pre = p_cur;
p_cur = p_next;

备注:
循环条件,当然是p_cur != nullptr
循环结束后,p_cur当然为nullptr,所以返回p_pre,即为反转后的头结点

3、图例
(2)初始状态

(2)改变指向,节点后移

(3)完成翻转后结果

代码

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(NULL == pHead)
            return NULL;
        ListNode *p_cur = pHead;
        ListNode *p_next = pHead->next;
        ListNode *p_pre = NULL;
        while(p_cur)
        {
            p_next = p_cur->next;
            p_cur->next = p_pre;
            p_pre = p_cur;
            p_cur = p_next;
        }
        return p_pre;
    }
};
posted @ 2021-06-06 00:18  veis  阅读(405)  评论(0编辑  收藏  举报