C语言小作业,单向链表操作,翻转单向链表指定区间的元素,要求时间复杂度为O(n),空间复杂度为O(n)。
/*****************
* C语言链表翻转小作业
* 要求:
* 给定一个单向链表,给定两个整数left、right,
* 将该链表的第left和第right个节点之间的这一部分反转,
* 要求时间复杂度为O(n),空间复杂度为O(n)。
* - 有偿代写 联系小企鹅 1561968262 -
*/
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node* next;
}Node, * LinkList;
void InitList(LinkList* L)//初始化
{
*L = (Node*)malloc(sizeof(Node));
(*L)->next = NULL;
}
void CreateFromTail(LinkList L)//建立
{
Node* r, * s;
int flag = 1;
r = L;
while (flag) {
int c;
scanf("%d", &c);
if (c != -1) {
s = (Node*)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
} else {
flag = 0;
r->next = NULL;
}
}
}
void ShowList(LinkList L) {
Node* s;
s = L->next;
printf("链表:");
while (s != NULL) {
printf("%d ", s->data);
s = s->next;
}
printf("\n");
}
void ReverseList(LinkList L) {
int left, right, i = 0;
Node* front = L->next;
Node* back = NULL;
Node* head = NULL;
Node* current = NULL;
printf("请您输入left和right值:");
scanf("%d%d", &left, &right);
//让front指向要翻转的第一个元素的前一个元素
for (i = 0; i < left - 2; ++i) {
front = front->next;
}
//current表示每次从要翻转的元素中拿出一个元素
current = front->next;
//back表示翻转后的最后一个元素
back = current;
for (i = 0; i < right - left; i++) {
//从要翻转的元素中取出一个给n
Node* n = current;
//让current继续指向要翻转的下一个元素
current = current->next;
//将取出的n通过头插法插入到head头结点的链表中
if (head) {
Node* temp = head;
head = n;
head->next = temp;
} else {
head = n;
}
}
//将指向要翻转的第一个元素的前一个元素指向翻转后的头结点
front->next = head;
//将翻转后的最后一个元素指向翻转区域的下一个元素
back->next = current;
}
int main() {
int m;
Node* n = NULL;
LinkList L = NULL;
InitList(&L);
printf("请您输入整数,以-1结束:\n");
CreateFromTail(L);
ShowList(L);
ReverseList(L);
ShowList(L);
return 0;
}