1. 程式人生 > >資料結連結串列系列(詳細解析)

資料結連結串列系列(詳細解析)

目錄

前沿:本系列有關連結串列系列的題,會持續更新,題目主要來自於leetcode和lintcode,有需要可以參考一波,語言用的C++,當然如果有需要java版的,可以評論區留言,或者私發博主。

leetcode21. 合併兩個有序連結串列

將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。 

示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

思路:注意連結串列為空時的情況,當都不為空,使用迭代是一個比較快的解決方案

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
	ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
		if (l1 == NULL&&l2 == NULL)
		{
			return NULL;
		}
		if (l1 == NULL)
		{
			return l2;
		}
		if (l2 == NULL)
		{
			return l1;
		}
		ListNode *head = NULL;
		if (l1->val > l2->val)
		{
			head = l2;
			head->next = mergeTwoLists(l1, l2->next);
		}
		else
		{
			head= l1;
			head->next = mergeTwoLists(l1->next, l2);
		}
		return head;
	}
};

lintcode452. 刪除連結串列中的元素

刪除連結串列中等於給定值val的所有節點。

您在真實的面試中是否遇到過這個題?  是

樣例

給出連結串列 1->2->3->3->4->5->3, 和 val = 3, 你需要返回刪除3之後的連結串列:1->2->4->5

思路:lintcode頭結點是從第一個節點算起,所以跟普通連結串列題 有點不一樣。首先要判斷連結串列是否為空,是的話直接返回,然後考慮到單鏈表的刪除需要兩個指標變數的配合作用,那麼就要來定義兩個變數

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param head: a ListNode
     * @param val: An integer
     * @return: a ListNode
     */
    ListNode * removeElements(ListNode * head, int val) {
        // write your code here
        if(head==NULL)
        return head;
        ListNode *first=head,*second=head->next;
        while(second!=NULL)
        {
            if (second->val==val)
            {
                first->next=second->next;
                second=first->next;  //連結串列往後走
            
            }
            else
            {
                first=first->next;
                second=second->next;//連結串列往後走,注意兩句的不同
            }
            
        }
        if(head->val==val) head=head->next;
        return head;
    }
};

Lintcode 35.翻轉連結串列

翻轉一個連結串列

您在真實的面試中是否遇到過這個題?  是

樣例

給出一個連結串列1->2->3->null,這個翻轉後的連結串列為3->2->1->null

挑戰

在原地一次翻轉完成

思路:我們將表頭摘下,從第一個節點開始,一次前插入頭結點的後面,直到最後一個位置。時間複雜度O(1),。

LinkList Reverse(LinkList &L)
{
	
	if (L == NULL)
	{
		return L;
	}
	else {
		LNode *p = L->next,*last;
		L->next = NULL;
		while (p)
		{
			last = p->next;
			p->next = L->next;
			L->next = p;
			p = last;
		}
		return L;
	}
	



	
}