int createListHead(linkList *L,int n) {
linkList p;
int i = 0;
srand((int)time(0));
for (i = 0; i < n; i++)
{
p= (linkList)malloc(sizeof(Node));
p->data = rand() % 100;
printf("testing:Node[%d]=%d\n",i+1,p->data);
p->next = (*L)->next;
(*L)->next = p;
}
printf("链表(头插法)创建成功\n");
return 1;
}
int createListTail(linkList *L, int n) {
linkList p, temp;
temp = (*L);
int i;
srand((int)time(0));
for (i = 0; i < n;i++) {
p = (linkList)malloc(sizeof(Node));
p->data = rand() % 100;
printf("testing:Node[%d]=%d\n", i + 1, p->data);
p->next = NULL;
temp->next = p;
temp = p;
}
printf("链表(尾插法)创建成功\n");
return 1;
}
int insertList(linkList *L, int i, ElemType data)
{
linkList p;
linkList insNode;
p = (*L);
int j=0;
// 链表为空,在第1个位置插入一个新的节点;
if (p ->next == NULL) {
printf("链表为空,默认在第一个位置插入一个节点.\n");
insNode = (linkList)malloc(sizeof(Node));
insNode->data = data;
insNode->next = p->next;
p->next = insNode;
printf("节点插入成功.\n");
return 1;
}
// 链表非空的情况下,可以在i=1~length的位置插入节点,如果超过了链表的长度,就会提示错误;
// 其实如果在length+1的位置处插入一个新节点,就相当于在尾部追加一个节点,在本函数中会报错,可以单独实现一个函数;
while(p && jnext;
//printf("j=%d\tp->data=%d\n", j, p->data);
}
if (p->next==NULL) {
printf("您要插入的位置,超过了链表的长度 %d,请重新操作!\n",j);
return 0;
}
insNode = (linkList)malloc(sizeof(Node));
insNode->data = data;
insNode->next = p->next;
p->next = insNode;
printf("节点插入成功\n");
return 1;
}
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
示例1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例2:
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
void deleteNode(struct ListNode* node) {
if(!node || !node->next)
return;
node->val = node->next->val;
node->next = node->next->next;
}
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
if (n==0)
return head;
struct ListNode *fast=NULL, *slow=NULL, *p=NULL; //初始化为空
fast = slow = head;
for (int i=0; inext;
}
while (fast) {
p=slow;
fast=fast->next;
slow=slow->next;
}
if(slow==head)
head=head->next;
else {
p ->next = slow->next;
free(slow);
}
return head;
}
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *newHead=NULL, *next=NULL;
while (head) {
//单独取出下一个节点
next = head->next;
head->next = newHead;
newHead = head;
head = next;
}
return newHead;
}
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *l3=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *p1,*p2,*p3;
p1=l1;
p2=l2;
p3=l3;
if(p1 == NULL) return p2;
if(p2 == NULL) return p1;
while(p1 !=NULL && p2 !=NULL )
{
if(p1->val <= p2->val)
{
p3->next = p1;
p3 = p3->next;
p1 = p1->next;
}
else
{
p3->next =p2;
p3 = p3->next;
p2 = p2->next;
}
}
if(p1 == NULL)
{
p3->next = p2;
}
else
{
p3->next = p1;
}
return l3->next;
}
bool isPalindrome(struct ListNode* head) {
struct ListNode *newHead=NULL, *q=head;
struct ListNode* p;
while(head) {
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val=head->val;
p->next=newHead;
newHead=p;
head=head->next;
}
while(q) {
if(newHead->val!=q->val)
return false;
newHead=newHead->next;
q=q->next;
}
return true;
}
bool hasCycle(struct ListNode *head) {
struct ListNode *fast=head, *slow=head;
while(fast&&fast->next) {
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
return true;
}
return false;
}