题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。


分析:

逐个头插,实现反转

设置3个指针:head 头节点、prev 前一个节点、 cur 下一个节点


注意:链表为空,或者只有一个节点的情况!


代码:

#include<iostream>
using  namespace std;

struct ListNode{
	int val;
	ListNode *next;
	ListNode(int x) :val(x), next(nullptr){}

};
class Solution{
public:
	ListNode* reverseList(ListNode* pHead)
	{
		if (pHead == nullptr || pHead->next == nullptr) return pHead;

		ListNode dummy(-1);
		dummy.next = pHead;
		ListNode *head = &dummy;
		ListNode* prev = head->next;
		ListNode* cur = prev->next;
		do
		{
			prev->next = cur->next;
			cur->next = head->next;
			head->next = cur;
			cur = prev->next;

		} while (cur != nullptr);

		return dummy.next;
	}

};


剑指offer书上的代码:

ListNode* ReverList(ListNode* pHead)
{
    ListNode* pReverseHead = NULL;
    ListNode* pNode = pHead;
    ListNode* pPrev = NULL;
    
    while(pNode != NULL)
    {
        ListNode* pNext = pNode->m_next;
        
        if(pNext == NULL)
            pReverseHead = pNode;
         
         pNode->m_next = pPrev;
         
         pPrev = pNode;
         pNode = pNext;
    }
    
    return pReverseHead;
 }

欢迎讨论交流!