链表翻转
2015-08-13 15:06 codinglol 阅读(244) 评论(0) 编辑 收藏 举报题目描述
给出一个链表和一个数k,比如,链表为1→2→3→4→5→6,k=2,则翻转后2→1→6→5→4→3,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→6→5,用程序实现。
分析与解法
这个问题与旋转字符串类似,根据给出的k,将链表分为两段X和Y,将他们分别反转即可得到结果。
首先我们来看下如果要将一个链表反转应该怎么做,比如,链表为1>2>3>4>5>6,反转为6>5>4>3>2>1,代码如下:
1 ListNode *ReverseList(ListNode *head){ 2 if(head == NULL) 3 return NULL; 4 ListNode *ReversedHead = NULL; 5 ListNode *pNode = head; 6 ListNode *pPre = NULL; 7 while(pNode){ 8 ListNode *pNext = pNode->next; 9 if(pNext == NULL) 10 ReversedHead = pNode; 11 pNode->next = pPre; 12 pPre = pNode; 13 pNode = pNext; 14 } 15 }
由于是链表,我们可以先将整个链表反转,然后通过记录的相应指针来做少量修改,来重建新的链表,代码如下:
1 ListNode *RotateList(ListNode *head, int n){ 2 if(head == NULL || n < 0) 3 return NULL; 4 int count = 0; 5 ListNode *ReversedHead = NULL; //第二段链表的头结点 6 ListNode *pNode = head; 7 ListNode *pPre = NULL; 8 ListNode *newHead = NULL; //新的链表的头节点 9 while(pNode){ 10 ++count; 11 //第n个节点即为新链表的头结点 12 if(count == n) 13 newHead = pNode; 14 15 ListNode *pNext = pNode->next; 16 if(pNext == NULL) 17 ReversedHead = pNode; 18 pNode->next = pPre; 19 //第n+1个节点为新链表的尾节点 20 if(count == n+1) 21 pNode->next = NULL; 22 pPre = pNode; 23 pNode = pNext; 24 } 25 //head为第一段链表的尾节点 26 head->next = ReversedHead; 27 return newHead; 28 }