/* 题目给出的链表数据结构 struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; 1.记录原链表下一个节点 防止断链 2.将原链表头节点插到新链表中 3.重新设置两个链表的头节点 注意:带头指针初始化与不带头指针初始化的区别,其他大致相同。 */ // 不带头指针 class Solution { public: ListNode* ReverseList(ListNode* pHead) { ListNode *cur = pHead, *nex; // cur 当前节点 , nex 当前节点的下一个节点,记录指针防止断链 pHead=NULL; // 初始化新链表的头节点 while(cur) { nex = cur->next; // 记录当前节点的下一个节点,防止断链 cur->next = pHead; // 将当前节点插到新链表的头节点 pHead = cur; // 重新设置新链表的头节点 cur = nex; // 重新设置原始链表头节点 } return pHead; } }; /* 带有头指针的链表 */ class Solution { public: ListNode* ReverseList(ListNode* pHead) { ListNode *cur = pHead->next, *nex; // cur 当前节点 ,nex 当前节点的下一个节点 pHead->next = NULL;//初始化头指针 while(cur) { nex = cur->next; // 记录头节点的下一个节点,防止断链 cur->next = pHead->next; // 将当前节点插到新链表的头指针的后面 pHead->next = cur; cur = nex; // 重新设置原始链表头节点 } return pHead; } };