【牛客网 面试必刷TOP101】BM2 链表内指定区间反转
BM2 链表内指定区间反转
描述
示例1
示例2
思路
题解
/** * struct ListNode { * int val; * struct ListNode *next; * }; * * C语言声明定义全局变量请加上static,防止重复定义 */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类 */ struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) { // write code here struct ListNode * pre = NULL; struct ListNode * pos = NULL; struct ListNode * tmp = NULL; struct ListNode * nNode = head; //链表为空的情况 if(head==NULL) return NULL; //链表不为空的情况 //如果n和m相等,即不反转的情况 if(n-m==0) return head; //如果是n>m,即存在反转的情况 if(n-m>0) { //首先用tmp存储m的上一个节点,用pre存储m节点,用pos存储m的下一个节点 if(m==1) { pre = head; pos = pre->next; }else if(m==2) { tmp = head; pre = head->next; pos = pre->next; }else{ tmp = head; for(int i=0;i<m-2;i++) tmp = tmp->next; pre = tmp->next; pos = pre->next; } //找到第n个节点 for(int i=0;i<n-1;i++) nNode = nNode->next; //如果tmp==NULL,则说明会将nNode逆转为头节点 if(tmp==NULL) head = nNode; //调整第m-1个节点的链接 //如果tmp为NULL,此步会报错 if(tmp!=NULL) tmp->next = nNode; //调整第m个节点的next链接 pre->next = nNode->next; //将m到n个节点进行逆转 for(int i=0;i<n-m;i++) { tmp = pos->next; pos->next = pre; pre = pos; pos = tmp; } } return head; }
思路
题解
/** * struct ListNode { * int val; * struct ListNode *next; * }; * * C语言声明定义全局变量请加上static,防止重复定义 */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类 */ struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) { // write code here //生成一个伪头节点 struct ListNode res; res.val = -1; res.next = head; //定义两个节点指针 struct ListNode *pre = &res; struct ListNode *cur = pre->next; //找到第m个节点和其前一个节点 for(int i=0;i<m-1;i++) { pre = cur; cur = cur->next; } //开始进行逆序变换 for(int i=0;i<n-m;i++) { struct ListNode * temp = cur->next; cur->next = temp->next; temp->next = pre->next; pre->next = temp; } return res.next; }
下一篇:
数据结构与算法--基本介绍