题目
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。链接:206. 反转链表 - 力扣(LeetCode)
题解
方法一:类似头插法
设置3个指针cur、next、newhead,其中cur和next指向当前链表头结点,newhead指向空指针。当cur不为空时,next指向下一个元素,cur的next指向newhead,然后把cur赋给newhead,变为新链表的头结点,cur再指向next,以此类推,直至cur指向空结点,此时newhead为反转后的链表的头结点。
代码如下:
struct ListNode* reverseList(struct ListNode* head) { struct ListNode* cur = head; struct ListNode* next = head; struct ListNode* newhead = NULL; while (cur) { next = next->next; cur->next = newhead; newhead = cur; cur = next; } return newhead; }
方法二:修改原链表中指针的方向
设置3个指针n1、n2、n3,其中n1指向空指针,n2指向头结点,n3指向第二个结点。当n2不为空时,n2指向n1,然后n1 、n2、n3同时向后移动一个位置,以此类推,直至n2指向空结点,此时n1为反转后链表的头结点。注意,当原链表为空时,n3是非法的,所以应当分两种情况讨论,链表为空时直接返回空指针,不为空时按照上述方法执行。另外,当n3指向空指针时,不能继续往后移动,所以在n3移动前应当判断一下n3是否为空指针。
代码如下:
struct ListNode* reverseList(struct ListNode* head) { if (head == NULL) return NULL; struct ListNode* n1 = NULL; struct ListNode* n2 = head; struct ListNode* n3 = n2->next; while (n2) { n2->next = n1; n1 = n2; n2 = n3; if (n3) n3 = n3->next; } return n1; }