题目描述:
给定一个排序的链接列表,删除所有具有重复数字的节点,从原始列表中只留下不同的数字。
例如, 给定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
}