203.移除链表元素
题目:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
解题思路:直接在原有的链表上操作, 需要注意的找到链表中节点符合当前值得节点时, 需要将下个节点更新为当前节点,主要节点的指向问题
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(head == NULL)
{
return head;
}
struct ListNode *pre = head;
while( pre->next != NULL)
{
if(pre->next->val == val)
{
pre->next = pre->next->next;
}
else{
pre = pre->next;
}
}
if(head->val == val) //注意只含有一个值,且值为目标值的链表
{
head = head->next;
}
return head;
}
};
206.反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
解题思路:
1.采用辅助数组,将当前链表保存起来,反向更新链表每个节点的值
2.在原链表中,直接反转节点。
解法1:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL || head->next == NULL)
{
return head;
}
int len = 0;
int a[5000];
struct ListNode* temp=head;
while(temp!=NULL)
{
a[len++] = temp->val;
temp = temp->next;
}
temp=head;
len = len-1;
while(temp!=NULL)
{
temp->val = a[len--];
temp = temp->next;
}
return head;
}
解法2:遍历链表,将当前节点的next指针改为指向前一个节点。
/**
* Definition for singly-linked list.
* 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) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = head; //当前节点
ListNode*temp; //用于存储当前节点的next节点
ListNode* pre = NULL; //当前节点的前一个节点
while(cur != NULL)
{
temp = cur->next; //存放当前节点
cur->next = pre; //反向
pre = cur;
cur= temp;
}
return pre;
}
};