
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* nxp;
};
struct Node* XOR(struct Node* a,
struct Node* b)
{
return (struct Node*)((uintptr_t)(a)
^ (uintptr_t)(b));
}
struct Node* insert(struct Node** head,
int value)
{
if (*head == NULL) {
struct Node* node
= (struct Node*)malloc(
sizeof(struct Node));
node->data = value;
node->nxp = XOR(NULL, NULL);
*head = node;
}
else {
struct Node* curr = *head;
struct Node* prev = NULL;
struct Node* node
= (struct Node*)malloc(
sizeof(struct Node));
curr->nxp = XOR(node,
XOR(
NULL, curr->nxp));
node->nxp = XOR(NULL, curr);
*head = node;
node->data = value;
}
return *head;
}
void printList(struct Node** head)
{
struct Node* curr = *head;
struct Node* prev = NULL;
struct Node* next;
while (curr != NULL) {
printf("%d ", curr->data);
next = XOR(prev, curr->nxp);
prev = curr;
curr = next;
}
}
struct Node* reverseK(struct Node** head,
int K, int len)
{
struct Node* curr = *head;
if (curr == NULL)
return NULL;
else if (len < K)
return *head;
else {
int count = 0;
struct Node* prev = NULL;
struct Node* next;
while (count < K) {
next = XOR(prev, curr->nxp);
prev = curr;
curr = next;
count++;
}
prev->nxp = XOR(NULL,
XOR(prev->nxp,
curr));
(*head)->nxp = XOR(XOR(NULL,
(*head)->nxp),
curr);
if (curr != NULL)
curr->nxp = XOR(XOR(curr->nxp,
prev),
*head);
return prev;
}
}
void reverseLL(struct Node* head,
int N, int K)
{
head = reverseK(&head, N, N);
head = reverseK(&head, K, N);
head = reverseK(&head, N, N);
printList(&head);
}
int main()
{
int N = 6;
struct Node* head = NULL;
insert(&head, 1);
insert(&head, 3);
insert(&head, 11);
insert(&head, 8);
insert(&head, 6);
insert(&head, 7);
int K = 3;
reverseLL(head, N, K);
return (0);
}
0 comments:
Post a Comment