力扣203.移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val){
while(head!=NULL&&head->val==val)
{
head=head->next;//遍历该链表
}
struct ListNode* cur=head; //当前节点
struct ListNode* pre=head; //保存待删除节点的前一节点
//cur和pre此时都指向头节点
while(cur!=NULL)
{
if(cur->val==val){
pre->next=cur->next;
}
else{
pre=cur; //继续往下找需要删除的节点
}
cur=cur->next;
}
return head;
LeetCode206.反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
1.头插法
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* newhead =NULL;
struct ListNode* cur=head;
while(cur)
{
struct ListNode* p=cur->next;
cur->next=newhead;
newhead=cur;
cur=p;
}
return newhead;
}
2.迭代的反转
struct ListNode* n1=NULL,*n2=head,*n3=head->next;
while(n2)//n2不为空时进入循环
{
n2->next=n1;//反转 首先让1指向空变为尾
//迭代让后续的都反转过来
n1=n2;
n2=n3;
if(n3)//n3不为空才能使n3->next有意义
n3=n3->next;
}
return n1;
LeetCode19删除链表倒数第N个结点
给定单链表头结点,删除链表中倒数第 k 个结点
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
要求只遍历一次,所以我选择利用双指针来解决这道题。
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
if(head == NULL || n == 0)
return head;
struct ListNode* slow =head;
struct ListNode* fast =head;
while(n--)
{
fast = fast->next;
if(fast==NULL)
return head->next;
}
while(fast->next)
{
fast = fast->next;
slow = slow->next;
}
slow->next=slow->next->next;
return head;
}
判断两个单链表是否相交
若相交则找出第一个相交的节点
struct Node*find_node(struct Node*head1,struct Node* head2)
{
//链表带头节点
if(head1==NULL||head2==NULL)
{
return NULL;//为空肯定不相交
}
Node* p1,p2;
p1=head1;
p2=head2;
int len1=0;
int len2=0;
int index=0;
while(p1->next!=NULL)
{
p1=p1->next;
len1++;
}
while(p2->next!=NULL)
{
p2=p2->next;
len2++;
}
index=abs(len1-len2);
if(len1>len2)
{
p1=head1;
p2=head2;
}
else
{
p1=head2;
p2=head1;
}
if(p1!=p2)
{
return NULL;
}
for(int i=0;i<index;i++)
{
p1=p1->next;
}
while(p1!=p2)
{
p1=p1->next;
p2=p2->next;
}
return p1;
}
如何判断链表有环?如何计算环的长度?如何判断环的入口点?
//判断是否有环 利用快慢指针
bool isLoop(struct Node * phead)
{
struct Node* fast=phead;
struct Node* slow=phead;
while(slow!=NULL&&fast!=NULL&&fast->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
{
return true;
}
}
}