程式碼隨想錄演算法訓練營第三天| 203. 移除連結串列元素、707.設計連結串列、206.反轉連結串列

清源风起时發表於2024-06-26

203加一個頭節點統一進行操作,很方便,最後提交的時候去掉頭節點就好。

 1 class Solution {
 2 public:
 3     ListNode* removeElements(ListNode* head, int val) {
 4         //為了操作統一 還是整一個頭出來比較合適
 5         //依舊是多一個頭 好操作
 6         ListNode* h = new ListNode(0);
 7         h->next = head;
 8         ListNode* h1 = h;
 9         while(h->next != NULL)
10         {
11             if(h->next->val == val)
12             {
13                 h->next = h->next->next;
14             }
15             else{
16                 h = h->next;  
17             }
18         }
19         return h1->next;
20     }
21 };

707就是考察連結串列的基礎操作

  1 class MyLinkedList
  2 {
  3 public:
  4 
  5     MyLinkedList()//初始化鏈物件
  6     {
  7         ListNode* head1 = new ListNode(4396);
  8         head1->next = NULL;
  9         len = 0;//帶頭結點 所有第一個不算入長度
 10         //這個值我帶不回來
 11         head = head1;
 12     }
 13 
 14     void Print() {//列印整個連結串列
 15         t = head;
 16         while (t) {
 17             cout << t->val << " ";
 18             t = t->next;
 19         }
 20         cout << endl;
 21     }
 22 
 23     int get(int index)//獲取連結串列中下標為index的節點值
 24     {
 25         if (index >= len || index < 0)
 26         {
 27             return -1;
 28         }
 29         t = head;
 30         while (index-- >= 0) {
 31             t = t->next;
 32         }
 33         return t->val;
 34     }
 35 
 36     void addAtHead(int val)//頭插入
 37     {
 38         t = new ListNode(val);
 39         t->next = head->next;
 40         head->next = t;
 41         len++;
 42     }
 43 
 44     void addAtTail(int val)//尾插入
 45     {
 46         t = head;
 47         while (t->next)
 48         {
 49             t = t->next;
 50         }
 51         t->next = new ListNode(val);
 52         len++;
 53     }
 54 
 55     void addAtIndex(int index, int val)
 56     {
 57         if (index > len)
 58         {
 59             return;
 60         }
 61         t = head;
 62         while (index-- > 0)
 63         {
 64             t = t->next;
 65         }
 66         ListNode* temp = new ListNode(val);
 67         temp->next = t->next;
 68         t->next = temp;
 69         len++;
 70     }
 71 
 72     void deleteAtIndex(int index)
 73     {
 74         if (index < 0 || index >= len) 
 75         {
 76             return;
 77         }
 78         t = head;
 79         while (index-- > 0)
 80         {
 81             t = t->next;
 82         }
 83         t->next = t->next->next;
 84         len--;
 85     }
 86 
 87 private:
 88     struct ListNode {
 89         int val;
 90         ListNode* next;
 91         //結構體內可以塞建構函式 而且引數列表不同 可以過載
 92         ListNode(int x)
 93         {
 94             val = x;
 95             next = NULL;
 96         }
 97         //或者寫簡略形式
 98         //ListNode(int x):val(x),next(NULL){}
 99     };
100     ListNode* head;//頭節點
101     ListNode* t;//用於類中函式使用
102     int len;//連結串列長度
103 };

206題把原來的連結串列當輸入材料,重新輸入一遍即可。

 1 class Solution {
 2 public:
 3     //將原連結串列當作資料來源 重新以頭插法做表
 4     ListNode* reverseList(ListNode* head) {
 5         ListNode* ans = new ListNode(0);
 6         ListNode* h = head;
 7         while(h){
 8             h = h->next;
 9             head->next = ans->next;
10             ans->next = head;
11             head = h;
12         }
13         return ans->next;
14     }
15 };

相關文章