Skip to content

Instantly share code, notes, and snippets.

@kballenegger
Created February 14, 2014 05:09
Show Gist options
  • Select an option

  • Save kballenegger/8996127 to your computer and use it in GitHub Desktop.

Select an option

Save kballenegger/8996127 to your computer and use it in GitHub Desktop.
Find the middle node in a linked list.
//
// File.c
//
//
// Created by Kenneth Ballenegger on 1/13/14.
//
//
#include <stdlib.h>
#include <stdio.h>
typedef struct node_t *node_p;
typedef struct node_t {
int value;
node_p next;
} node_t;
node_p new_node(int value, node_p next) {
node_p node = calloc(1, sizeof(node));
node->value = value;
return node;
}
// i'm leaking memory, i don't care. fuck it
int middle_node_int(node_p node) {
node_p middle_node = NULL;
middle_node_int_rec(node, 0, &middle_node);
return middle_node->value;
}
// note: does not account for lists with an even number of node, handled by int division
// used internally only, returns max
int middle_node_int_rec(node_p next, int count_so_far, node_p *output) {
if (next->next) {
int max = middle_node_int_rec(next->next, count_so_far + 1, output);
if (count_so_far == max / 2) {
*output = next;
}
return max;
} else {
return count_so_far;
}
}
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
// creating nodes, from last to first
node_p node;
node = new_node(9, NULL);
node = new_node(8, node);
node = new_node(7, node);
node = new_node(6, node);
node = new_node(5, node);
node = new_node(4, node);
node = new_node(3, node);
node = new_node(2, node);
node = new_node(1, node);
return middle_node_int(node);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment