反转单链表
题目链接
下面主要介绍两种方法:
方法一:
利用三个指针变量进行反转
具体过程如图所示:
注意:循环的结束的条件为cur == NULL
而不是next == NULL
实现代码:
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* newHead = NULL;
struct ListNode* cur = head;
while (cur)
{
struct ListNode* curNext = cur->next; //如果next放在循环外面定义,就不好控制循环结束条件
cur->next = newHead;
newHead = cur;
cur = curNext;
}
return newHead;
}
方法二:
利用哨兵位实现反转
具体过程如图所示:
注1:循环结束的条件为cur->next == NULL
注2:返回之前要将哨兵位释放,防止内存泄露
实现代码:
struct ListNode* reverseList(struct ListNode* head)
{
//如果链表为空,直接退出,返回NULL
if (head == NULL)
return NULL;
//创建哨兵为
struct ListNode* newHead = (struct ListNode*)malloc(sizeof(struct ListNode));
newHead->next = head;
//实现反转
struct ListNode* cur = head;
while (cur->next)
{
struct ListNode* curNext = cur->next;
cur->next = curNext->next;
curNext->next = newHead->next;
newHead->next = curNext;
}
//释放哨兵位,返回新的头
struct ListNode* retHead = newHead->next;
free(newHead);
return retHead;
}