707.设计链表

    1. class MyLinkedList {
    2. public:
    3. // 定义链表节点结构体
    4. struct LinkedNode {
    5. int val;
    6. LinkedNode* next;
    7. LinkedNode(int val):val(val), next(nullptr){}
    8. };
    9. // 初始化链表
    10. MyLinkedList() {
    11. _dummyHead = new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
    12. _size = 0;
    13. }
    14. // 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
    15. int get(int index) {
    16. if (index > (_size - 1) || index < 0) {
    17. return -1;
    18. }
    19. LinkedNode* cur = _dummyHead->next;
    20. while(index--){ // 如果--index 就会陷入死循环
    21. cur = cur->next;
    22. }
    23. return cur->val;
    24. }
    25. // 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
    26. void addAtHead(int val) {
    27. LinkedNode* newNode = new LinkedNode(val);
    28. newNode->next = _dummyHead->next;
    29. _dummyHead->next = newNode;
    30. _size++;
    31. }
    32. // 在链表最后面添加一个节点
    33. void addAtTail(int val) {
    34. LinkedNode* newNode = new LinkedNode(val);
    35. LinkedNode* cur = _dummyHead;
    36. while(cur->next != nullptr){
    37. cur = cur->next;
    38. }
    39. cur->next = newNode;
    40. _size++;
    41. }
    42. // 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
    43. // 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点
    44. // 如果index大于链表的长度,则返回空
    45. void addAtIndex(int index, int val) {
    46. if (index > _size) {
    47. return;
    48. }
    49. LinkedNode* newNode = new LinkedNode(val);
    50. LinkedNode* cur = _dummyHead;
    51. while(index--) {
    52. cur = cur->next;
    53. }
    54. newNode->next = cur->next;
    55. cur->next = newNode;
    56. _size++;
    57. }
    58. // 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的
    59. void deleteAtIndex(int index) {
    60. if (index >= _size || index < 0) {
    61. return;
    62. }
    63. LinkedNode* cur = _dummyHead;
    64. while(index--) {
    65. cur = cur ->next;
    66. }
    67. LinkedNode* tmp = cur->next;
    68. cur->next = cur->next->next;
    69. delete tmp;
    70. _size--;
    71. }
    72. // 打印链表
    73. void printLinkedList() {
    74. LinkedNode* cur = _dummyHead;
    75. while (cur->next != nullptr) {
    76. cout << cur->next->val << " ";
    77. cur = cur->next;
    78. }
    79. cout << endl;
    80. }
    81. private:
    82. int _size;
    83. LinkedNode* _dummyHead;
    84. };