天天看點

LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議

持續更新

  • 連結清單基礎知識
  • 8道經典連結清單常考題目-----LeetCode
    • 連結清單逆序(easy)-----206
    • 連結清單逆序2(medium)-----92
    • 連結清單求交點(easy)
    • 連結清單求環(medium)
    • 連結清單劃分(medium)
    • 複雜連結清單的複制(hard)
    • 2個排序連結清單歸并(easy)
    • k個排序連結清單歸并(hard)
  • 解題方法,代碼實作
  • 一些學習與找工作建議

連結清單基礎知識

圖示:

LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議
LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議

代碼:

#include <stdio.h>

struct ListNode {
	int val;      //存儲元素的資料域
	ListNode *next;
};    //存儲下一節點位址的指針域

int main(){
	ListNode a;
	ListNode b;
	ListNode c;
	ListNode d;
	ListNode e;
	a.val = 10;
	b.val = 20;
	c.val = 30;
	d.val = 40;
	e.val = 50;
	a.next = &b;  //------1-----
	b.next = &c;
	c.next = &d;
	d.next = &e;
	e.next=NULL;  //----2-------
	ListNode $head = &a;
	while(head){
		printf("%d\n",heas->val)
		head = head->next;  //-----3------
	}
	return 0;
}
           

8道經典連結清單常考題目-----LeetCode

連結清單逆序(easy)-----206

已知連結清單頭節點指針head,将連結清單逆序。(不可申請額外空間)

圖示:

在這裡插入圖檔描述

LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議

代碼:

struct ListNode {
	int val;      //存儲元素的資料域
	ListNode *next;//指針域
	ListNode(int x) : val(x), next(NULL) {}
};    //構造函數

class Solution{
public:       //連結清單頭節點指針
	ListNode* reverseList(ListNode* head){
	}          //傳回連結清單逆序後的頭節點指針
};
           

思路:

LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議
LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議

代碼:

class Solution{
public:       //連結清單頭節點指針
	ListNode* reverseList(ListNode* head){
	ListNode *new_head = NULL;//指向新連結清單頭節點的指針
	while(head){
		ListNode *next = head->next;//備份head->next-----1-----
		head->next = new_head;//更新head=>next-----2-----
		new_head = head;//移動new_head----3-----
		head = next;//周遊連結清單
	}
	return new_head;//傳回新連結清單頭節點
	}          //傳回連結清單逆序後的頭節點指針
};
           

測試:

int main(){
	ListNode a;
	ListNode b;
	ListNode c;
	ListNode d;
	ListNode e;
	a.next = &b;
	b.next = &c;//将節點簡單的連結,進行測試
	c.next = &d;//無需構造複雜的操作(插入,删除)
	d.next = &e;
	Solution solve;
	ListNode *head = &a;
	printf("Before reverse:\n");
	while(head){
		printf("%d\n",head->val);
		head = head->next;
	}
	head = solve.reverseList(&a);
	prtinf("After reverse:\n");
	while(head){
		printf("%d\n",head->val);
		head = head->next;
	}
	return 0;
}
	
           
LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議

連結清單逆序2(medium)-----92

已知連結清單頭節點指針head,将連結清單從位置m到n逆序。(不申請額外空間)

圖示:

LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議

代碼:

class Solution{
public:
	ListNode* reverseBetween(ListNode* head, int m, int n){
	}
};
           

思路:

LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議
LeetCode刷題----連結清單連結清單基礎知識8道經典連結清單常考題目-----LeetCode解題方法,代碼實作一些學習與找工作建議

思考:

1.最終結果應該傳回哪個節點?

2.如果m=1時,有什麼特殊的?

代碼:

class Solution{
public:
	ListNode* reverseBetween(ListNode* head,int m,int n){
		int change_len =n - m + 1;//計算需要逆置的節點個數
		ListNode *pre_head = NULL;//初始化開始逆置的節點的前驅
		ListNode *result = head;//最終轉換後的連結清單頭節點,非特殊情況即為head
		while(head && ==m){     //将head向前移動m-1個位置
		//-------1-------
			head = head->next;
		}						//将modify_list_tail指向目前的head,即逆置後的連結清單尾
		ListNode *modify_list_tail = head;
		ListNode *new_heaad = NULL;
		while(head && change_len){//逆置change——len個節點
			ListNode *next = head->next;
			head->next = new_head;
			new_head = head;
			head = next;
			//-------2-----
		}
			//-----3------
		if (pre_head){             //如果pro——head不變,說明不是從第一個結點開始逆置的m》1
		//-----4------
		}
		else{
		//--------5-----
		}
		return result;
	}
};
           

連結清單求交點(easy)

連結清單求環(medium)

連結清單劃分(medium)

複雜連結清單的複制(hard)

2個排序連結清單歸并(easy)

k個排序連結清單歸并(hard)

解題方法,代碼實作

一些學習與找工作建議