代码改变世界

链表翻转

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 }