题目:给定一个固定的单链表,输入两个数begin和end。将下标为begin到end之间的内容逆置。
给定的单链表为:0->2->4->6->8->10->12->14->16->18
测试数据确保begin和end不会超出单链表的长度范围,并且end>=begin
本人的代码入下:
给定的单链表为:0->2->4->6->8->10->12->14->16->18
测试数据确保begin和end不会超出单链表的长度范围,并且end>=begin
本人的代码入下:
#include <iostream> using namespace std; struct List { int num; List *next; }; List *head; List* reverse(int begin, int end, List *&head) { if(begin==end)return head; end-=begin; List* pre=new List; pre->next=head; for(int i=0;i<begin;i++) { pre=pre->next; } List* pstart=pre->next; while(end--) { List *p=pstart->next; pstart->next=p->next; p->next=pre->next; pre->next=p; } return pre->next; } List *Create() { List *p = NULL; List *q = NULL; head = NULL; for ( int i = 0; i < 10; i++ ) { p = new List; p->num = i * 2; if ( head == NULL ) { head = p; } else { q->next = p; } q = p; } if ( head != NULL ) { q->next = NULL; } return head; } void displayList(List *head) { while ( head != NULL ) { cout << head->num; head = head->next; if ( head != NULL ) { cout << "->"; } } cout << endl; } int main() { Create(); int begin, end; cin >> begin >> end; reverse(begin, end, head); displayList(head); return 0; }
目前问题是假如输入begin=0,那么逆置后的链表0之前的数都未被输出。如输入begin=0,end=3,输出就是0->8->10->12->14->16->18。
求高手帮本人看看是什么原因?
解决方案
20
原因是while循环之前,pStart=head,
while之后,pStart->next 指向num=8那个节点了(这样head->next->num = 8)
所以你0前面的都没有打印出来。
假如你begin != 0; 这时候pStart != head, 这样while循环就不会影响head指针,displayList就会正常输出了。
—
帮你改成这样,你试试
while之后,pStart->next 指向num=8那个节点了(这样head->next->num = 8)
所以你0前面的都没有打印出来。
假如你begin != 0; 这时候pStart != head, 这样while循环就不会影响head指针,displayList就会正常输出了。
—
帮你改成这样,你试试
List* reverse(int begin, int end, List *&head) { if(begin==end)return head; end-=begin; List* pre=new List; pre->next=head; for(int i=0;i<begin;i++) { pre=pre->next; } List* pstart=pre->next; List* tmpHead = head; while(end--) { List *p=pstart->next; pstart->next=p->next; p->next=pre->next; pre->next=p; } head = tmpHead; return pre->next; }
—
你这样写法不推荐的,原因是你不停的变动next指针,一般人看不懂,第二,容易出现指针错误。本人也是看了很久很久
给你优化了下reverse函数,如下:
struct List { int num; List *next; void reverse(List* list) { if (list == NULL) return; int tmp = num; num = list->num; list->num = tmp; }; }; List *head; List* getListByIndex(int index, List* list) { if (NULL == list) return NULL; if (index < 0) return NULL; if (index == 0) return list; return getListByIndex(--index,list->next); } List* reverse(int begin, int end, List *&head) { List* beginList = NULL; while (begin < end) { beginList = getListByIndex(begin++,head); if (beginList) { beginList->reverse(getListByIndex(end--,head)); } } return head; }