前言:养成习惯,写链表,写指针的时候,要如履薄冰,不然程序说崩就崩。慢即是快。
1.反转链表:
原理思路:
利用三个指针,从头到尾遍历链表,每次将当前节点的指向反转,并更新三个指针的位置。最后返回反转后的头节点。这个方法的时间复杂度是O(n),空间复杂度是O(1)。当n2非空时进入循环,当n3为空时停止n3的下移,防止内存问题。
图解示例:
示例一:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例二:
输入:head = [1,2]
输出:[2,1]
示例三:
输入:head = []
输出:[]
代码实现:
truct ListNode* reverseList(struct ListNode* head){
if(head == NULL || head->next == NULL) return head; //如果链表为空或只有一个节点,直接返回head
struct ListNode* n1 = NULL, *n2 = head, *n3 = head->next;
while(n2)
{
//反转
n2->next = n1;
//迭代
n1 = n2;
n2 = n3;
if(n3) n3 = n3->next;
}
return n1;//此时n1是头节点
}