题目:
对于链表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;
}
}