题目描述:
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
题目解析:
循环
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* newHead=NULL;
struct ListNode* pre = head;
while(pre)
{
struct ListNode* next = pre->next;
pre->next = newHead;
newHead = pre;
pre = next;
}
return newHead;
}
更加清晰的思路:定义前一个节点、当前节点和后一个节点,循环链表。每次将当前节点指向当前节点的前一个节点,并依次向后移动这三个节点。代码:
/**
* 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==NULL)
{
return head;
}
ListNode* pre = NULL;
ListNode* cur = head;
ListNode* nex = head->next;
while(nex)
{
cur->next=pre;
pre = cur;
cur = nex;
nex = nex->next;
}
cur->next = pre;
return cur;
}
};
注意:while循环结束后需要将当前节点的下一个指向前一个节点,否则会断节。
递归
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL)
{
return NULL;
}
if(head->next==NULL)
{
return head;
}
struct ListNode* cur = head;
head = reverseList(head->next);
struct ListNode* now = head;
while(now->next!=NULL)
{
now = now->next;
}
now->next = cur;
cur->next = NULL;
return head;
}
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL)
{
return NULL;
}
if(head->next==NULL)
{
return head;
}
struct ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next=NULL;
return newHead;
}