首页 > 代码库 > 算法题——翻转链表中的一段

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

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

 

思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N);如果要求不能交换值,那么仅凭p1和p2是无法翻转的,只能交换两个指针之间的链表。

 

代码

交换值:

 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 = p->next ) {13         nodes.push_back(p);14         if ( p == p2 ) 15             break;16     }17 18     int i = 0, j = nodes.size() - 1;19     while ( i<j ) 20         swap(nodes[i++]->val, nodes[j--]->val);21 }

 

交换结点:

 1 void reverseNodes(ListNode *p1, ListNode *p2) { 2     if ( p1 == NULL || p1->next == NULL )  3         return; 4  5     ListNode *pre = p1->next, *cur = pre->next;   // 6  7     while ( cur != p2 && cur != NULL )  8     { 9         ListNode *tmp = cur->next;10         cur->next = pre;11         pre = cur;12         cur = tmp;13     }14 15     p1->next->next = cur;16     p1->next = pre;17 }