官方解法有迭代法和递归法两种。官方的迭代法不是那么好理解,我有另一个版本的实现。
迭代法:
先申请一个dummy节点,用于保存反转后的链表。此时,dummy所在链表是个空表。
用迭代法遍历原链表,从原链表上依次摘除节点,然后用头插法插入新链表,最后就得到一个反转链表了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
// 申请dummy节点,用于保存反转后的链表
struct ListNode *dummy = malloc(sizeof(struct ListNode));
dummy->next = NULL;
struct ListNode *temp = NULL;
while(head)// 当原链表空时,应终止循环
{
// 先让temp保存原链表头节点,然后从原链表中摘除头节点
temp = head;
head = head->next;
// 头插法将temp插入新的链表中
temp->next = dummy->next;
dummy->next = temp;
}
// 让head指向反转后链表头节点,并释放dummy的内存
head = dummy->next;
free(dummy);
return head;
}