方法一---将各next指针指向反转
struct ListNode
{
int val;
struct ListNode* next;
};
由于链表物理上不连续,各个结点通过结点中的next指针所链接,反转指针指向,意味着后一个结点的位置需要记录,那么我们就需要一个next指针用于记录每次前两个指针反转后的后一个指针。而创建prev与cur指针用于反转指向,每次反转后通过next指针就能够移动prev与cur指向的位置。
struct ListNode* prev = NULL;
struct ListNode* cur = head;
struct ListNode* next = cur->next;
if (head == NULL)
return NULL;
while (cur)
{
cur->next = prev;
prev = cur;
cur = next;
if (next)//next不为空才能解引用
next = next->next;
}
return prev;
方法二---新建链表,遍历原链表将每个结点头插入新链表
struct ListNode* newhead = NULL;
struct ListNode* cur = head;
头插,每次遍历将结点插入到最前面,那么最后就将原链表反转。由于插入进来会改变每个结点的next指针指向,那么需要额外创建一个next指针,用于记录下一个结点位置,我们在循环内部创建即可,因为每次循环next都指向下一个待插入的结点,同时next也不会非法访问,因为cur为空停止循环。
while (cur)
{
struct ListNode* next = cur->next;
cur->next = newhead;
newhead = cur;
cur = next;
}
return newhead;