算法题——翻转链表中的一段
题目:给出一个链表中的两个指针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 }