题目:给出一个链表中的两个指针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 }
原文:http://www.cnblogs.com/qieerbushejinshikelou/p/3920690.html