H3C笔试题:C语言旋转双向链表

来源:互联网 发布:linq.js where 编辑:程序博客网 时间:2024/04/30 07:03

准备H3C面试刷的一道题  4MIN写完草稿  BUG FREE 分享一下:

#include<stdio.h>
typedef struct node
{
int data;
struct node* prev;
struct node* next;
}ListNode;


ListNode* new_node(int val)
{
ListNode* node = (ListNode*) malloc(sizeof(ListNode));
node->data = val;
node->prev = NULL;
node->next = NULL;
return node;
}


void print(ListNode* head)
{
if (head == NULL)
{
return;
}
while (head != NULL)
{
printf("%d\n", head->data);
head = head->next;
}
}


void print_reverse(ListNode* tail)
{
if (tail == NULL)
{
return;
}
while (tail != NULL)
{
printf("%d\n", tail->data);
tail = tail->prev;
}
}


ListNode* rotate_list(ListNode* head, int val)
{
if (head == NULL)
{
return;
}


ListNode* old_head = head; ListNode* prev = NULL; ListNode* tail = head;


while (tail->next != NULL)
{
tail = tail->next;
}
while (head != NULL&&head->data!=val)
{
head = head->next;
}
if (head == NULL)
{
return old_head;
}
if (head->next == NULL)
{
prev = head->prev;
prev->next = NULL;
head->next = old_head;
old_head->prev = head;
head->prev = NULL;
return head;
}
else
{
prev = head->prev;
prev->next = NULL;
tail->next = old_head;
old_head->prev = tail;
head->prev = NULL;
return head;
}
}


void delete_node(ListNode* head,int val)
{
if (head == NULL)
{
return;
}
while (head != NULL&&head->data!=val)
{
head = head->next;
}
if (head != NULL)
{
if (head->next == NULL)
{
head->prev->next = head->next;
free(head);
head = NULL;
}
else
{
ListNode* next = head->next;
ListNode* prev = head->prev;
prev->next = next;
next->prev = prev;
free(head);
head = NULL;
}
}

}
int main()
{
ListNode* l1=new_node(3);
ListNode* l2=new_node(1);
ListNode* l3=new_node(10);
ListNode* l4=new_node(7);
ListNode* l5=new_node(6);
ListNode* l6=new_node(5);
l1->next = l2;
l2->prev = l1;


l2->next = l3;
l3->prev = l2;
l3->next = l4;
l4->prev = l3;
l4->next = l5;
l5->prev = l4;
l5->next = l6;
l6->prev = l5;

ListNode* new_list = rotate_list(l1, 100);
print(new_list);


return 0;
}

原创粉丝点击