题目描述
给定一个单链表,实现一个调整单链表的函数,使得每 K 个节点之间的值逆序,如果最后不够 K 个节点一组,则不调整最后几个节点。
输入描述:
第一行一个整数 n,n 表示单链表的节点数量。
第二行 n 个整数 val 表示链表的各个节点的值。
第三行一个整数 K。
输出描述:
在给定的函数内返回链表的头指针。
示例1
输入
复制
5
1 2 3 4 5
3
输出
复制
3 2 1 4 5
备注:
1 \le K \le n \le 10000001≤K≤n≤1000000
-1000000 \le val_i \le 1000000−1000000≤val
i
≤1000000
思路:每次逆序用栈来储存节点的val值,不改变链表的指向,改变链表中的值,使其逆序。
# include <bits/stdc++.h>
using namespace std;
struct list_node{
int val;
struct list_node * next;
};
list_node * input_list()
{
int val, n;
scanf("%d", &n);
list_node * phead = new list_node();
list_node * cur_pnode = phead;
for (int i = 1; i <= n; ++i) {
scanf("%d", &val);
if (i == 1) {
cur_pnode->val = val;
cur_pnode->next = NULL;
}
else {
list_node * new_pnode = new list_node();
new_pnode->val = val;
new_pnode->next = NULL;
cur_pnode->next = new_pnode;
cur_pnode = new_pnode;
}
}
return phead;
}
list_node * reverse_knode(list_node * head1, int K)
{
//在下面完成代码
stack<int> st;
list_node * p=head1, * p1=head1 ;
while(head1!=NULL)
{
p=head1;
int x=0;
while( x<K && head1!=NULL )
{
st.push(head1->val);
head1=head1->next;
x++;
}
if(x==K)
{
while(p!=head1)
{
p->val=st.top();
st.pop();
p=p->next;
}
}
}
return p1;
}
void print_list(list_node * head)
{
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
puts("");
}
int main ()
{
list_node * head = input_list();
int K;
scanf("%d", &K);
list_node * new_head = reverse_knode(head, K);
print_list(new_head);
return 0;
}