Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. use std::cell::RefCell;
  2. use std::iter::FromIterator;
  3. use std::rc::Rc;
  4.  
  5. pub struct List<T> {
  6. head: Option<Rc<RefCell<Node<T>>>>,
  7. tail: Option<Rc<RefCell<Node<T>>>>,
  8. }
  9.  
  10. struct Node<T> {
  11. element: T,
  12. next: Option<Rc<RefCell<Node<T>>>>,
  13. }
  14.  
  15. impl<T> List<T> {
  16. pub fn new() -> Self {
  17. List { head: None, tail: None }
  18. }
  19.  
  20. pub fn push_front(&mut self, element: T) {
  21. let mut new_head = Node { element: element, next: None };
  22. if let Some(old_head) = self.head.take() {
  23. new_head.next = Some(old_head);
  24. }
  25. self.head = Some(Rc::new(RefCell::new(new_head)));
  26. if self.tail.is_none() {
  27. self.tail = Some(self.head.as_ref().unwrap().clone());
  28. }
  29. }
  30.  
  31. pub fn pop_front(&mut self) -> Option<T> {
  32. if let Some(old_head) = self.head.take() {
  33. let mut old_head = Rc::try_unwrap(old_head)
  34. .map_err(|_| ()).unwrap()
  35. .into_inner();
  36. self.head = old_head.next.take();
  37. if self.head.is_none() {
  38. self.tail = None;
  39. }
  40. Some(old_head.element)
  41. } else {
  42. None
  43. }
  44. }
  45.  
  46. pub fn push_back(&mut self, element: T) {
  47. let new_tail = Rc::new(RefCell::new(Node { element: element, next: None }));
  48. if let Some(old_tail) = self.tail.take() {
  49. old_tail.borrow_mut().next = Some(new_tail.clone());
  50. }
  51. self.tail = Some(new_tail);
  52. if self.head.is_none() {
  53. self.head = Some(self.head.as_ref().unwrap().clone());
  54. }
  55. }
  56.  
  57. pub fn pop_back(&mut self) -> Option<T> {
  58. // if let Some(mut previous) = self.head.clone() {
  59. // let old_tail = self.tail.take().unwrap();
  60. // while let Some(node) = previous.borrow().next.as_ref() {
  61. // if Rc::ptr_eq(&node, &old_tail) {
  62. // self.tail = Some(node.clone());
  63. // let old_tail = Rc::try_unwrap(old_tail)
  64. // .map_err(|_| ()).unwrap()
  65. // .into_inner();
  66. // return Some(old_tail.element);
  67. // }
  68. // previous = node.clone();
  69. // }
  70. // }
  71. // None
  72. unimplemented!()
  73. }
  74. }
  75.  
  76. impl<T> FromIterator<T> for List<T> {
  77. fn from_iter<It: IntoIterator<Item=T>>(iter: It) -> Self {
  78. let mut list = List::new();
  79. for element in iter {
  80. list.push_back(element);
  81. }
  82. list
  83. }
  84. }
  85.  
  86. impl<T> Extend<T> for List<T> {
  87. fn extend<It: IntoIterator<Item=T>>(&mut self, iter: It) {
  88. for element in iter {
  89. self.push_back(element);
  90. }
  91. }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement