876.链表的中间节点
题目:876. 链表的中间结点 - 力扣(LeetCode)
①解决思路
方法1:遍历数组一遍后用count记录总节点数,这之后使用count/2再次从头遍历,找到中间节点并返回。
方法2:使用快慢指针,慢指针一次走一步,快指针一次走两步,当快指针走到结束时,慢指针指向的就是中间节点。
②代码实践
因为方法一较为容易实现,这里先实现方法二
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* slow, *fast;
slow = fast = head;
//fast与fast->next顺序不能调换,因为&&具有短路效应,替换可能会有fast为空指针的情况
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
203.移除链表元素
①解决思路
方法1:用前后两个指针分别指向不同节点,当后面的指针指向的节点值等于目标值时,后面的指针跳过这一节点并将其释放,不断迭代得到最后结果。
方法2:创建一个新链表,不是val值的就尾插在它的后面,反之则不进行。
②代码实践
方法1
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* prev = NULL;
struct ListNode* cur = head;
while (cur)
{
if (cur->val != val)
{
prev = cur;
cur = cur->next;
}
else
{
if (prev == NULL)
{
head = cur->next;
free(cur);
cur = head;
}
else
{
prev->next = cur->next;
free(cur);
cur = prev->next;
}
}
}
return head;
}
方法2
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode*newHead = NULL, *tail = NULL;
struct ListNode* cur = head;
while(cur)
{
if(cur->val != val)
{
//尾插
if(tail == NULL)
{
newHead = tail = cur;
}
else
{
tail->next = cur;
tail = tail->next;
}
cur = cur->next;
}
else
{
struct ListNode* next = cur->next;
free(cur);
cur = next;
}
}
if(tail)
tail->next = NULL;
return newHead;
}