一、移除链表元素
1.题目.
2.思路.
思路1:很简单,最常规的方法,建立一个新的链表,头为newHead,遍历链表,不是val值的拿下来尾插,注意一些细节,比如,你拿一个节点的时候,你拿的这个节点里面存的是下一个节点的地址,可能在最后一个节点,后面还跟了其它节点,只要把最后一个节点里面的next置NULL就行,在就是特殊情况特殊处理,就能做好这个题。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//首先明白:每一个节点是malloc开辟在堆区的一块空间
//各个节点都是用指针连接起来的
//每一个题只是要求每一个空间的连接方式不同
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
ListNode* pcur = head; //pcur遍历链表
ListNode* newHead = NULL;
ListNode* newTail = NULL;
while(pcur)
{
//找有用的节点
if(pcur->val!=val)
{
if(newHead == NULL)
{
newHead = pcur;
newTail = pcur;
}
else
{
//尾插
//找到尾结点
newTail->next =pcur;
newTail = pcur;
}
}
pcur = pcur->next;
}
//当pcur == NULL时,NULL没有放进最后一个节点
//根据测试用例,[]
//保证新链接的链表能至少链接一个节点
if(newHead)
{
newTail->next = NULL;
}
return newHead;
}
思路2:遍历一遍链表把val在原链表中删除,这个思路说起来简单,做起来难!下面好好解析,怎么做,我是问的答疑老师,老师给我解惑,这一点特别感谢老师!!!
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* tmp = (struct ListNode*)malloc(sizeof(struct ListNode));
tmp->next = head;
struct ListNode* cur = head;
struct ListNode* prev = tmp;
while(cur)
{
if(cur->val==val)
{
prev->next = cur->next;
cur = cur->next;
}
else{
prev = cur;
cur = cur->next;
}
}
return tmp->next;
}
二、链表的中间结点
1.题目.
2.思路.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head) {
//此题分为两种情况
//1.节点的个数为偶数 结束条件fast == NULL
//2.节点的个数为奇数 结束条件fast->next == NULL
//3.咱们要写的是循环条件
struct ListNode* fast = head,*slow = head;
//这儿在考虑一点,如果没节点和一个节点情况
//这种情况满足
while(fast&&fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
完结!!!