链 表

3_1 删除链表中的节点

Answer-将被删节点下一个val复制到待删除节点,然后将待删节点直接连接到下下一个节点即可。

学到:

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

 *     ListNode(int x) : val(x), next(NULL) {}

 * };

 */

c++中结构体可以看作一个权限为public的类。其拥有成员变量、成员函数、构造函数等。

ListNode(int x) : val(x), next(NULL) {}就是构造函数的列表初始化操作。

3_2 删除链表的倒数第N个节点,给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

My-获取长度再跑到待删除节点前节点进行删除即可

Answer-快慢指针、栈

学到:初始化一个链表

结构体:

struct ListNode{
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode* next) : val(x), next(next) {}
};

初始链表并链上:

ListNode* head[5];
for (int i = 0; i < 6; i++)
{
    head[i] = new ListNode(i + 1);
}
for (int i = 0; i < 6; i++)
{
    head[i]->next = head[i + 1];
}
head[5]->next = nullptr;

注意:结构体声明再.h中只需要include  .h即可不用包含.cpp文件,不然会导致多重定义的符号的错误。

3_3 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

My-头插法

Answer-递归方法,1->2->3->4->5   

  1. 1->2->3->4<-5
  2. 1->2->3<-4<-5
  3. 1->2<-3<-4<-5
  4. 1<-2<-3<-4<-5

核心 head->next->next = head ;

注意:

ListNode* reverseList(ListNode* head) {

        ListNode* p = head;

        ListNode* result = new ListNode();

        result->next = nullptr;

        while(p != nullptr)

        {

            ListNode *q = p;

            p = p->next;

            q->next = result->next;

            result->next = q;

            

        }

        return result->next;

    }

 头插法时,一定让 p = p->next;紧跟ListNode *q = p;后,不然就找不到原本的顺序了。

你可能感兴趣的:(#,初级算法,链表,数据结构)