js 删除链表中重复的节点

JavaScript025

js 删除链表中重复的节点,第1张

题目描述:

给定一个排序的链接列表,删除所有具有重复数字的节点,从原始列表中只留下不同的数字。

例如, 给定1->2->3->3->4->4->5,返回1->2->5。

给定1->1->1->2->3,返回2->3。

JavaScript 版数据结构与算法(三)链表

可以看出JavaScript中的链表是通过不断 new 出来节点,并在节点的next属性上继续 new 创建出来的

结构大概长这样:

参考资料:

https://github.com/chihungyu1116/leetcode-javascript

先来了解一个基础知识

b=a,但改变 b,并不会影响 a

y=x , 但改变y,会影响x,因为class有原型链

1=>2=>3,链表是由一组节点组成的集合。每个节点都使用一个对象的引用指向它的后继,指向另一个节点的引用叫做链

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

输入:head = [1,2,6,3,4,5,6] val = 6

输出:[1,2,3,4,5]

#include <stdlib.h>

#include <memory.h>

#include <stdio.h>

#include <string.h>

struct node /*节点的数据结构*/

{

int num

char str[20]

struct node *next

}

struct node *creat(struct node *head)

struct node *insert(struct node *head, char *pstr, int n)

struct node *delet(struct node *head, char *pstr)

void print(struct node *head)

/* * * * * * * * * * * * * * * * * * * * * * * * * * * */

main()

{

/*函数声明*/

struct node *head

char str[20]

intn

head = NULL /*做空表*/

head=creat(head) /*调用函数创建以head 为头的链表*/

print(head) /*调用函数输出节点*/

printf("\n input inserted num,name:\n")

gets(str)/*输入学号*/

n = atoi(str)

gets(str)/*输入姓名*/

head = insert(head, str, n) /*将节点插入链表*/

print(head) /*调用函数输出节点*/

printf("\n input deleted name:\n")

gets(str)/*输入被删姓名*/

head=delet(head,str) /*调用函数删除节点*/

print(head) /*调用函数输出节点*/

return

}

/* * * * * * * * * * * * * * * * * * * * * */

/* * * 创建链表* * * * * * * * * * * */

struct node *creat(struct node *head)

{

char temp[30]

struct node *p1,*p2

p1 = p2 = (struct node*) malloc(sizeof(struct node))

printf ("input num, name: \n")

printf("exit:double times Enter!\n")

gets(temp)

gets(p1->str)

p1->num = atoi(temp)

p1->next = NULL

while (strlen(p1->str)>0)

{

if (head==NULL)head=p1

else p2->next = p1

p2 = p1

p1 = (struct node *)malloc(sizeof(struct node))

printf ("input num, name: \n")

printf("exit:double times Enter!\n")

gets(temp)

gets(p1->str)

p1->num=atoi(temp)

p1->next=NULL

}

return head

}

/* * * * * * * * * * * * * * * * * * * */

/* * * * * * * * * * 插入节点* * * * * * * * * */

struct node *insert(struct node *head, char *pstr, int n)

{

struct node *p1, *p2, *p3

p1=(struct node*)malloc(sizeof(struct node))

strcpy(p1->str, pstr)

p1->num = n

p2 = head

if(head == NULL)

{

head = p1

p1->next = NULL

}

else

{

while ((n >p2->num) &&(p2->next != NULL))

{

p3 = p2

p2 = p2->next

}

if (n <= p2->num)

if (head==p2)

{

head = p1

p1->next = p2

}

else

{

p3->next = p1

p1->next = p2

}

else

{

p2->next = p1

p1->next = NULL

}

}

return(head)

}

/* * * * * * * * * * * * * * * * * * * * * * * * */

/* * * * * 删除节点* * * * * * * * * * * * */

struct node *delet(struct node *head, char *pstr)

{

struct node *temp, *p

temp = head

if(head == NULL)

printf("\nList is null!\n")

else

{

temp = head

while((strcmp(temp->str, pstr) != 0) &&(temp->next != NULL))

{

p = temp

temp = temp->next

}

if(strcmp(temp->str, pstr) == 0)

{

if(temp == head)

{

head = head->next

free(temp)

}

else

{

p->next = temp->next

printf("delete string : %s\n", temp->str)

free(temp)

}

}

else printf("\nno find string!\n")

}

return(head)

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/* * * * * * * * * * 链表各节点的输出* * * * * * * * * */

void print (struct node *head)

{

struct node *temp

temp = head

printf("\n output strings:\n")

while(temp!=NULL)

{

printf("\n%d----%s\n", temp->num, temp->str)

temp = temp->next

}

return

}