算法题——翻转链表中的一段

题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转。

 

思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N);

如果要求不能交换值,那么仅凭p1和p2是无法翻转的,因为不知道p1之前的节点,会掉链,只能翻转p1之后的链表,这个过程就类似于给定一个头节点,翻转之后的链表了;可以使用头插法。

 

代码

交换值:

 

 1 struct ListNode 
 2 {
 3     int val;
 4     ListNode *next;
 5 };
 6 
 7 void reverseNodes(ListNode *p1, ListNode *p2) {
 8     if ( p1 == NULL || p2 == NULL ) 
 9         return;
10 
11     vector<ListNode*> nodes;
12     for(vector<ListNode*>::iterator p = p1; p != p2->next ; p = p->next )  //借助vector,可以随机访问p1和p2之间的节点 
13     {
14         nodes.push_back(p);
15     }
16 
17     int i = 0, j = nodes.size() - 1;
18     while ( i<j ) 
19         swap(nodes[i++]->val, nodes[j--]->val);
20 }

  

posted @ 2014-08-18 23:00  阿杰的专栏  阅读(239)  评论(0编辑  收藏  举报