2.3.1
題目描述:
這題和曾經做過的LeetCode203.移除元素一模一樣,所以我們就使用LeetCode進行書寫,題目鏈接203. 移除鏈表元素 - 力扣(LeetCode)
解題思路
·大家的第一反應肯定是根據書上所學的書寫方法一樣書寫,但是書上有一種情況沒有說明,那就是如果要刪除的節點是頭節點該如何處理,這里我們就要考慮到頭結點是如何處理的
·處理頭節點可以直接對鏈表操作,也可以使用其他方法處理,在這里我提供一個方法,就是使用虛擬頭結點對頭結點操作,也就是在鏈表頭結點前定義一個虛擬頭結點,這樣就可以把頭結點當作普通節點進行處理了
·大家可能不明白我我說的意思,可以直接看代碼,就可以理解了
代碼如下:
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* dummyHead = new ListNode(0);//定義一個虛擬節點值為0dummyHead->next = head;//虛擬頭結點指向鏈表頭結點ListNode* cur = dummyHead;//定義臨時節點用于遍歷鏈表while(cur->next != NULL){if(cur->next->val == val){//書上的刪除節點操作ListNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;}else{cur = cur->next;}}head = dummyHead->next;delete dummyHead;//刪除虛擬頭結點return head;}
};
2.3.2
題目描述
解題思路
1.我們在鏈表的操作中,一定要記下被操作元素的前驅結點,而后繼節點可以很輕易的得到
2.這道題和上一題沒有什么本質上的區別,我們只需要再定義一個minn變量,用于記錄下當前最小節點的前驅即可
3.所以我們只需要不斷的比較cur->next就可以了
4.再用一個臨時節點temp用于記錄cur->next即可
代碼如下:
#include <iostream>
using namespace std;typedef struct LNode
{int data;struct LNode* next;
} LNode, * LinkList;// 頭插法
void HeadInsert(LinkList& L)
{int val = 0;while (cin >> val){LNode* s = new LNode;s->data = val;s->next = L->next;L->next = s;if (cin.get() == '\n'){break;}}
}// 尾插法
void TailInsert(LinkList& L)
{int val = 0;LNode* r = L;while (cin >> val){LNode* s = new LNode;s->data = val;r->next = s;r = s;r->next = NULL;if (cin.get() == '\n'){break;}}
}// 遍歷輸出鏈表元素
void Print(LinkList L)
{LNode* p = L->next;while (p){cout << p->data << '\t';p = p->next;}cout << endl;
}void DelMinValue(LinkList& L) {LNode* p, * pre;p = L->next, pre = L;LNode* minp, * minpre;minp = p; minpre = pre;while (p) {if (p->data < minp->data) {minpre = pre;minp = p;}pre = p;p = p->next;}minpre->next = minp->next;delete minp;
}int main()
{LinkList L = new LNode;TailInsert(L);DelMinValue(L);Print(L);
}
運行結果
2.3.3
這道題也與LeetCode206.反轉鏈表一致,繼續使用LeetCode進行學習206. 反轉鏈表 - 力扣(LeetCode)
解題思路
1.可以重新定義一個鏈表,將第一個鏈表中的元素取出后,再放入新建的鏈表中,即可實現,這個方法同樣也可以借助棧進行求解
2.可以考慮使用雙指針法,不理解雙指針法的同學可以不考慮使用這個方法
代碼如下
雙指針法
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* temp;//保存cur的下一個節點ListNode* cur = head;ListNode* pre = NULL;while(cur){temp = cur->next;// 保存一下,cur的下一個節點,因為要改變cur->nextcur->next = pre;//進行翻轉操作//更新pre和cur指針pre = cur;cur = temp;}return pre;}
};