c語言i++和++i程序
Problem statement:
問題陳述:
Given a linked list, you modified that linked list in such a way that the elements of the first half of that linked list are the difference of the first node to the last node and next node is the difference of the second node to the second last node and goes on.
給定一個鏈表,您修改鏈表的方式是,鏈表的前半部分的元素是第一個節點與最后一個節點的差,下一個節點是第二個節點與第二個節點的差。節點并繼續。
Example:
例:
Input:
4 → 5 → 9 → 3 → 8 → 1 → 2 → 5
Output:
-1 → 3 → 8 → -5 → 8 → 1 → 2 → 5
Input:
6 → 5 → 4 → 9 → 1 → 2 → 7
Output:
-1 → 3 → 3 → 9 → 1 → 2 → 7
Algorithm:
算法:
To solve the problem we can follow this algorithm:
為了解決這個問題,我們可以遵循以下算法:
First, we find the midpoint of that linked list and take a copy of that.
首先,我們找到該鏈表的中點并復制它。
Then we divide that linked list from the middle point.
然后,我們從中間點劃分該鏈表。
Then reverse the second part of that linked list.
然后反轉該鏈接列表的第二部分。
Then calculate the difference of the first node of the two linked list and put the value to the original linked list.
然后計算兩個鏈接列表的第一個節點的差并將該值放入原始鏈接列表。
Continue to find the difference until we go to the last node of the second element.
繼續找到差異,直到我們轉到第二個元素的最后一個節點。
C++ implementation:
C ++實現:
#include <bits/stdc++.h>
using namespace std;
struct node {
int data;
node* next;
};
void print(node*);
//Create a new node
struct node* create_node(int x)
{
struct node* temp = new node;
temp -> data = x;
temp -> next = NULL;
return temp;
}
//Enter the node into the linked list
void push(node** head, int x)
{
struct node* store = create_node(x);
if (*head == NULL) {
*head = store;
return;
}
struct node* temp = *head;
while (temp -> next) {
temp = temp -> next;
}
temp -> next = store;
}
void split_list(node* head, node** a, node** b)
{
struct node* fast = head -> next;
struct node* slow = head;
while (fast != NULL && fast -> next != NULL) {
slow = slow -> next;
fast = fast -> next -> next;
}
struct node* temp = slow -> next;
slow -> next = NULL;
*a = head;
*b = temp;
}
struct node* reverse(node* b)
{
struct node* curr = b;
struct node* next = NULL;
struct node* prev = NULL;
while (curr != NULL) {
next = curr -> next;
curr -> next = prev;
prev = curr;
curr = next;
}
return prev;
}
void merge(node* a, node* b, node** c)
{
struct node* temp = a;
*c = create_node(0);
struct node* curr = *c;
while (temp && b) {
curr -> next = create_node(temp -> data - b -> data);
b = b -> next;
temp = temp -> next;
curr = curr -> next;
//cout<<curr->data<<" ";
}
if (b != NULL) {
curr -> next = b;
curr = curr -> next;
}
curr -> next = reverse(a);
*c = (*c) -> next;
}
struct node* modifyTheList(struct node* head)
{
//add code here.
struct node* a;
struct node* b;
struct node* c;
split_list(head, &a, &b);
struct node* temp = reverse(b);
merge(temp, a, &c);
return c;
}
//Print the list
void print(node* head)
{
struct node* temp = head;
while (temp) {
cout << temp -> data << " ";
temp = temp -> next;
}
}
int main()
{
struct node* l = NULL;
push(&l, 1);
push(&l, 2);
push(&l, 3);
push(&l, 4);
push(&l, 5);
push(&l, 6);
cout << "Before the modify operation" << endl;
print(l);
l = modifyTheList(l);
cout << "\nAfter the modify operation" << endl;
print(l);
return 0;
}
Output
輸出量
Before the modify operation
1 2 3 4 5 6
After the modify operation
5 3 1 4 5 6
翻譯自: https://www.includehelp.com/cpp-programs/modify-contents-of-linked-list.aspx
c語言i++和++i程序