满意答案
C++的STL的list就是双向链表,java的LinkedList也是一个双向链表,删除,换位都是很简单的事情,但是他们的节点都是得不到的,因为用户只需要关心数据,而不需要关心节点怎么实现
下面是C写的,一开始的循环内容是数字1到8,然后对1所在节点操作,于是完成后1左边的8被删除了,1和右边的2对换。截图在最下面。。很小的一个图片~
=================================================
#include
#include
typedef struct _node {
int value;
struct _node *left;
struct _node *right;
} node;
void hook(node *anode, node *left, node *right) {
anode->left = left;
anode->right = right;
left->right = anode;
right->left = anode;
}
node * unhook(node *anode) {
if (anode->left == anode) {
free(anode);
return 0;
}
node *ret = anode->right;
anode->left->right = anode->right;
anode->right->left = anode->left;
free(anode);
return ret;
}
node * make_node(int value) {
node *new_node = (node *) malloc(sizeof(node));
new_node->value = value;
return new_node;
}
node * make_single_node(int value) {
node *new_node = make_node(value);
hook(new_node, new_node, new_node);
return new_node;
}
node * make_middle_node(int value, node *left, node *right) {
node *new_node = make_node(value);
hook(new_node, left, right);
return new_node;
}
node * create_double_linked_circle(int *start, int *last) {
node *head = make_single_node(*start);
node *left = head, *right = head;
while (++start != last) {
left = make_middle_node(*start, left, right);
}
return head;
}
void swap(node *x, node *y) {
if (x != y) {
int temp = x->value;
x->value = y->value;
y->value = temp;
}
}
node * process(node *anode) {
if (!anode) return 0;
if (anode->right == anode) {
free(anode);
return 0;
}
swap(anode, anode->right);
unhook(anode->left);
return anode;
}
void print_circle(node *head) {
if (!head) return;
node *cur = head;
do {
printf("%d ", cur->value);
cur = cur->right;
} while (cur != head);
printf("\
");
}
void free_circle(node *head) {
while (head) {
head = unhook(head);
}
}
int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, };
node *head = create_double_linked_circle(array, array+8);
print_circle(head);
head = process(head);
print_circle(head);
free_circle(head);
return 0;
}
00分享举报