Reverse Linked List II --一道很锻炼链表和指针的题

来源:互联网 发布:阿里云服务器中文乱码 编辑:程序博客网 时间:2024/05/16 11:54

题目链接:https://oj.leetcode.com/problems/reverse-linked-list-ii/


#include <iostream>using namespace std;struct ListNode {int val;ListNode *next;ListNode(): val(0), next(NULL) {}ListNode(int x) : val(x), next(NULL) {}};class Solution {public:ListNode *reverseBetween(ListNode *head, int m, int n) {if(head == NULL || m == n) return head;int i;ListNode *first = NULL;ListNode *temp  = head;for(i = 0; i < m - 1; i++){first = temp;temp  = temp -> next;}ListNode *end      = temp;ListNode *temp_pre = temp;temp               = temp -> next;for(i = m + 1; i <= n; i++)                  //<span style="font-family: Arial, Helvetica, sans-serif;">主要步骤:将该节点的next指针指向前一个节点,然后temp_pre和temp都往前移</span>{ListNode *temp_next = temp -> next;temp -> next        = temp_pre;temp_pre            = temp;temp                = temp_next;}end -> next = temp;                         <span style="font-family: Arial, Helvetica, sans-serif;">//将原来的第m个节点与第n+1个节点连接</span>if(first) {                                 <span style="font-family: Arial, Helvetica, sans-serif;">//判断是否从一开始就反向</span>first -> next = temp_pre;}else {head = temp_pre;}return head;}};int main() {int len,m,n,t,i,j;cin>>len;ListNode *node = new ListNode[len+1], *head;head = node;for(i = 0; i < len;i++) {cin>>t;j = i;node[i].val  = t;node[i].next = &node[++j];}cin>>m>>n;Solution a;ListNode *res = a.reverseBetween(head,m,n);for(i = 0; i < len; i++) {if(i != len - 1) {cout<<res -> val<<"->";res = res -> next;}else {cout<<res -> val<<endl;}}delete [] node;system("PAUSE");}

0 0
原创粉丝点击