题目:给出一个链表中的两个指针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 }
时间: 2024-08-05 07:06:53