链表(裸题)

来源:互联网 发布:淘宝用卷怎么用 编辑:程序博客网 时间:2024/06/05 20:39

Doubly Linked List  Aizu - ALDS1_3_C 

Your task is to implement a double linked list.

Write a program which performs the following operations:

  • insert x: insert an element with key x into the front of the list
  • delete x: delete the first element which has the key of x from the list
  • deleteFirst: delete the first element from the list
  • deleteLast: delete the last element from the list

Input

The input is given in the following format:

n
command
1
command2
...
commandn

In the first line, the number of operations n is given. In the followingn lines, the above mentioned operations are given in the following format:

  • insert x
  • delete x
  • deleteFirst
  • deleteLast

Output

Print all the element (key) in the list after the given operations. Two consequtive keys should be separated by a single space.

Constraints

  • The number of operations ≤ 2,000,000
  • The number of delete operations ≤ 20
  • 0 ≤ value of a key ≤ 109
  • the number of elements in the list does not exceed 106

Sample Input 1

7insert 5insert 2insert 3insert 1delete 3insert 6delete 5

Sample Output 1

6 1 2

Sample Input 2

9insert 5insert 2insert 3insert 1delete 3insert 6delete 5deleteFirstdeleteLast

Sample Output 2

1

题目意思是指写一个支持插入元素,删除特定元素,删除头元素,删除尾元素,打印整条链表操作的链表。

下面是初始化操作:

然后是各种普通操作顺序:

在理解后就可以看代码了,本题为了快速的删除尾,所使用的是环型链表,上代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;struct Node{  int key;  Node *prev;  Node *next;};Node *head;Node *listSearch(int key){  Node *cur = head->next;  while(cur != head && cur->key != key){    cur = cur->next;  }  return cur;}void init(){  head = new Node;  head->prev = head;  head->next = head;}void printlist(){  Node *cur = head->next;  int isf = 0;  while(1){    if(cur == head)break;    if(isf++ > 0)printf(" ");    printf("%d",cur->key);    cur = cur->next;  }  printf("\n");}void insert(int key){  Node *x = new Node;  x->key = key;  x->next = head->next;  head->next->prev = x;  head->next = x;  x->prev = head;}void deleteNode(Node *t){  if(t == head)return;  t->prev->next = t->next;  t->next->prev = t->prev;  free(t);}void deleteFirst(){  deleteNode(head->next);}void deleteLast(){  deleteNode(head->prev);}void deletekey(int key){  deleteNode(listSearch(key));}int main(){  int key,n,i;  char com[20];  scanf("%d",&n);  init();  for(i = 0;i < n; i++){    scanf("%s%d",com,&key);    if(com[0] == 'i'){insert(key);}    else if(com[0] == 'd'){      if(strlen(com) > 6){        if(com[6] == 'F')deleteFirst();        else if(com[6] == 'L')deleteLast();      }      else{        deletekey(key);      }          }  }  printlist();  return 0;}


0 0
原创粉丝点击