方法一:使用栈,注意,在每次出栈将指针指向出栈的元素,然后将指针指向自己的next之后,一定要注意再将指针的next为NULL,否则会报错。
class Solution { public: ListNode* reverseList(ListNode* head) { ListNode * hd = new ListNode; stack<ListNode*> array; while(head!=nullptr) { array.push(head); head = head ->next; } ListNode * temp1 = hd; while(!array.empty()) { hd->next = array.top(); array.pop(); hd = hd->next; hd->next = nullptr; } return temp1->next; } };
方法二:
迭代,简单思想就是,初始化两个指针,一个指向头节点,一个指向null,也即一个在前一个在后,然后每次先存一下前面结点的next,然后把后面结点的值给前面结点的next,然后将前面结点的位置传给后面结点(向后移动),然后把刚刚存下的前面结点的next传给前面结点(向后移动)
class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *pre = head; ListNode *cur = nullptr; while(pre) { ListNode *temp = pre->next; pre->next = cur; cur = pre; pre = temp; } return cur; } };
方法三:递归
递归版本稍微复杂一些,其关键在于反向工作。假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?
答:让k+1的next指向k,操作就是k=k->next->next,并且应让k->next指向null,佛祖额链表中可能会产生环。
class Solution { public: ListNode* reverseList(ListNode* head) { if(!head||!head->next) return head; ListNode *NewHead = reverseList(head->next); head->next->next = head; head->next=nullptr; return NewHead; } };