嗨! 小伙伴们,我们又见面啦,今天由我来带大家一起看看这道OJ题----反转链表
咋一看,这题目好像听起来挺简单的,我们一起来分析分析!
思路一: 我们定义3个变量,分别为n1,n2,n3,分别记录前驱结点,当前结点,后继结点,改变原链表指针的指向。n1指向NULL, n2指向头结点, n3指向头结点的下一个结点。
第一次反转:
第一步: 我们先判断n2是否为空,如果不为空,那么修改n2的next指针,将n2的next指针指向n1(n2->next = n1)
第二步: 让n2赋给n1, n3赋给n2,如果n3不是NULL,那么n3->next赋给n3
我们再来判断: n2的next指针是否为空,如果非空,n2->next = n1, 然后n2赋给n1, n3赋给n2,如果n3不是NULL,那么n3->next赋给n3
第二次:
第三次:
第四次:
第五次:
请注意: 第5次循环的时候,n3已经为NULL,所以不会执行 n3 = n3->next 这条语句。
当n2==NULL时,跳出while循环,而n1恰好是链表的头结点,返回n1。
整体代码如下:
这里有一点请注意: 传过来的测试用例的head有可能为空,因此我们需要判断头结点是否为空的情况。
typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {
if(head == NULL){
//如果头结点为空,则返回头结点
return head;
}
ListNode* n1 = NULL;
//定义一个n1变量,n1指向NULL
ListNode* n2 = head;
//定义一个n2变量,n2指向头结点
ListNode* n3 = head->next;
//定义一个n3变量,n3指向头结点的下一个结点
while(n2 != NULL){
n2->next = n1;//n2用来改变原链表指针指向
n1 = n2; //把n2赋给n1
n2 = n3; //把n3赋给n2
if(n3){
//如果n3不为NULL
n3 = n3->next;//把n3->next赋给n3
}
}
return n1; //n1恰好是新的头结点
}
好啦,今天的讲解就到这里啦,我们下期再见!