题目描述:
给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k). 提示:这个题是链表逆置的升级变型。
结果分析:
题目思路:
利用栈的先进后出的性质,
1、将需要翻转的结点压入栈中;
2、将需要翻转的最后一节结点的后一个结点保存下来;
3、定义一个头结点,将栈中结点,取栈顶结点,链接起来;
4、当栈中数据全部取出后,将保存的后一个结点链接起来;返回头结点即可。
代码实现:
ListNode* RotateList(ListNode* list, size_t k)
{
assert(list);
assert(k >= 0);
ListNode* head;
if (k == 0)
return list;
else
{
stack<ListNode*> s;
ListNode* p = list;
for (int i = 0; i < k; i++) //将需要翻转的结点压入栈中
{
if (p != NULL)
{
s.push(p);
p = p->next;
}
}
ListNode* node = p;//保存需翻转结点的后一个节点
head = p = s.top();//连接节点数据
s.pop();
int size = s.size();
for (int i = 0; i < size; i++)
{
p->next = s.top();
s.pop();
p = p->next;
}
p->next = node;
}
return head;
}
如果需要翻转N个节点:时间复杂度为:O(N)
测试用例:
void Text()
{
ListNode* n1 = new ListNode(1);
ListNode* n2 = new ListNode(2);
ListNode* n3 = new ListNode(3);
ListNode* n4 = new ListNode(4);
ListNode* n5 = new ListNode(5);
ListNode* n;
n1->next = n2;
n2->next = n3;
n3->next = n4;
n4->next = n5;
/* n = RotateList(n1, 0);
n = RotateList(n1, 1);
n = RotateList(n1, 2);*/
/* n = RotateList(n1, 3);*/
/* n = RotateList(n1, 4);*/
/* n = RotateList(n1, 5);*/
n = RotateList(n1, 6);
}