最近在刷Leetcode中关于链表的题,发现很多题都涉及到了了链表的反转
给出一个链表[1, 2, 3, 4, 5]
反转为[5, 4, 3, 2, 1]
解决该问题可以用循环解决,而核心思想便是在循环中每次只让第I个元素插入到链表的头部
在循环之前链表长这样
1-> 2-> 3-> 4-> 5
第一次循环
2-> 1-> 3-> 4-> 5
第二次循环
3-> 2-> 1-> 4-> 5
…
如何写代码来解决?
对于上述过程,很显然我们需要一个指针一直指向头部之前的一位,构造一个链表长这样
NULL-> 1-> 2-> 3-> 4-> 5
利用指针一直指向NULL
这个值
然后再利用一个指针指向1
这个值
完整代码
struct ListNode* reverseList(struct ListNode* head) {
if (head == NULL || head->next == NULL)
return head;
struct ListNode* prev = (struct ListNode*)malloc(sizeof(struct ListNode));
prev->next = head;
struct ListNode* curr = head;
while (curr->next != NULL) {
struct ListNode* next = curr->next;
curr->next = next->next;
next->next = prev->next;
prev->next = next;
}
return prev->next;
}
第一次循环
NULL-> 1-> 2-> 3-> 4-> 5
| | |
prev curr next
第二次循环
NULL-> 2-> 1-> 3-> 4-> 5
| | |
prev curr next
…
可以把上述代码粘贴到 Leetcode 206. Reverse Linked List 跑一跑