本题是要逆置一个单链表。我想到了两种方法,第一种是加一个头结点的方法,第二种是不加头结点的方法。加头结点的方法如下
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* new_head = new ListNode(0);
new_head -> next = head;
ListNode* pre = new_head;
ListNode* cur = head;
while (cur && cur -> next) {
ListNode* temp = pre -> next;
pre -> next = cur -> next;
cur -> next = cur -> next -> next;
pre -> next -> next = temp;
}
return new_head -> next;
}
};
而不加头结点的方法更容易实现,构造一个空节点,依次将链表中的点插到该空节点头部。即可实现,代码如下
最后,翻阅资料发现一种递归的解决方案,比较抽象:class Solution { public: ListNode* reverseList(ListNode* head) { ListNode* pre = NULL; while (head) { ListNode* next = head -> next; head -> next = pre; pre = head; head = next; } return pre; } };
class Solution { public: ListNode* reverseList(ListNode* head) { if (!head || !(head -> next)) return head; ListNode* node = reverseList(head -> next); head -> next -> next = head; head -> next = NULL; return node; } };