【题目】从链表中点反转链表

来源:互联网 发布:迪优美特网络机顶盒c6 编辑:程序博客网 时间:2024/06/05 04:20

题目:

对于链表list,从中点开始进行反转链表的后半部分,对于奇数个数的链表,从(N+1)/2开始反转,对于偶数个数的链表,从N/2+1开始反转。


分析:

注意的是这个题目不同于倒序打印链表,所以先考虑整个反转链表的问题。要定义三个节点,pPre,pNext,pNode,记录每一个节点的pre和next。把pNode的next转成pre,pnext是pNode。这里注意一点,如果pNode==NULL,这就是新的list head。


中点位置反转链表:


#include<iostream>using namespace std;struct ListNode{int value;ListNode* next;ListNode(int i):value(i), next(NULL){}};ListNode* ReverseList(ListNode* head){if(head == NULL){return NULL;}int listlength = 0;ListNode* pNode = head;ListNode* startNode = NULL;ListNode* pReversedhead = NULL;ListNode* pPre = NULL;while(pNode!=NULL){pNode = pNode->next;listlength ++;}if (listlength %2 == 0){int numnode = 1;pNode = head;while(pNode!=NULL && numnode<listlength/2){pNode = pNode->next;numnode ++;}}else{int numnode = 1;pNode = head;while(pNode!=NULL && numnode<(listlength + 1)/2){pNode = pNode->next;numnode ++;}startNode = pNode;}ListNode* endnode = pNode;pNode = pNode ->next;startNode = pNode;while(pNode!=NULL){ListNode* pNext = pNode->next;if(pNext == NULL)pReversedhead = pNode;pNode->next = pPre;pPre = pNode;pNode = pNext;}endnode->next = pReversedhead;return head;}int main(){ListNode* node1 = new ListNode(NULL);ListNode* node2 = new ListNode(2);ListNode* node3 = new ListNode(3);ListNode* node4 = new ListNode(4);node1->next = NULL;node2->next = node3;node3->next = node4;node4->next = NULL;ListNode* new_head = ReverseList(node1);ListNode* node = new_head;while(node != NULL){cout << node->value << endl;node = node->next;}}