反转链表链表数据结构oj题(206)
目录
题目描述:
题目分析:
代码解决:
题目描述:
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
题目分析:
对于反转这道题,我们学习了单链表的增删改查后,立马就能想到第一个思路就是,遍历单链表,再进行头插,遍历中嵌套头插函数,时间复杂度不会很大,也就是O(n)。为了方便代码的书写,我们第二个思路就是直接反转,顾名思义就是改变指针指向的地址。可以方便我们写代码,重点讲解一下第二个思路,先上图,再讲解将抽象具体化
设置3个指针,一个n1用来指向到对应节点中,n2用来表示需要改变指向节点反向的节点,n3用来表示衔接n2,使得n2往后走,进而继续改变指向。思路简单,但是也很抽象,代码的简单的代价就是抽象。
代码解决:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode;
ListNode* reverseList(ListNode* head) {//考虑为空,防止空指针的解引用if (head == NULL){return NULL;}ListNode* n1, * n2, * n3;n1 = NULL; n2 = head; n3 = n2->next;//切换指向while (n2->next != NULL){n2->next = n1;n1 = n2;n2 = n3;n3 = n3->next;}//包括最后一项与链接n2->next = n1;n1 = n2;return n2;}