反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
code1:迭代
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { if(!head) return nullptr; else if(!head->next) return head; ListNode *newHead=head; ListNode *pre=nullptr; while(true) { ListNode *next=newHead->next; newHead->next=pre; pre=newHead; if(!next) break; newHead=next; } return newHead; } };
code2:递归
翻转链表要保存前结点的信息,所以可先翻转head->next,即翻转后面的链表,待后面的链表反转完成后,让最新的尾结点指向的next指向head即可,所以递归参数要head->next
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { if(!head||!head->next)//当走到最后一个结点时,会返回,head不会为nullptr return head; ListNode *tmp=reverseList(head->next);//tmp指向最后一个结点,也就是最新的头结点,它会从最深层递归依次向上返回该值 head->next->next=head; head->next=nullptr; return tmp; } };