算法练中将包含相关算法和一些与考研题目结合的C语言的算法题进行延伸思考,在用Java简单实现的同时,对内容深化并尝试C语言的叙述来更加巩固当前知识点。
题目1
存在一个按升序排列的链表,给你这个链表的头节点 head
,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。
方法:一次遍历
思路
这个题的思路比较简单,因为是按升序排列的,所以重复的元素基本都是相邻着的,因此只需要比较相邻两个节点的值,就能判断出是否是重复的。
代码实现
public class test { public static void main(String[] args) {
Node head = new Node(0); Node node1 = new Node(1); Node node2 = new Node(1); Node node3 = new Node(3); Node node4 = new Node(3); Node node5 = new Node(5);
head.setNext(node1); node1.setNext(node2); node2.setNext(node3); node3.setNext(node4); node4.setNext(node5);
Node h = head; while (h != null){ System.out.print(h.getData() + ""); h = h.getNext(); } Solution solution = new Solution(); head = solution.deleteDuplicates(head);
System.out.print("\n**********************"); while (head != null){ System.out.println(head.getData() + ""); head = head.getNext(); } } }
class Solution{ public Node deleteDuplicates(Node head) { if (head ==null ){ return head; } Node cur = head; while (cur.getNext() != null){ if(cur.getData() == cur.getNext().getData()){ cur.setNext(cur.getNext().getNext()); } else { cur = cur.getNext(); } } return head; } }
class Node{ private int Data; private Node next;
public Node(int Data){ this.Data = Data; }
public int getData(){ return Data; }
public void setData(int Data){
this.Data = Data; }
public Node getNext(){
return next; }
public void setNext(Node next){
this.next = next; } }
|
输出结果:
011335
0135
算法主体
Java
class Solution { public ListNode deleteDuplicates(ListNode head) { if (head ==null ){ return head; } ListNode cur = head; while(cur.next !=null ){ if(cur.val == cur.next.val ){ cur.next = cur.next.next; } else { cur = cur.next; } } return head; } }
|
C
struct ListNode* deleteDuplicates(struct ListNode* head) { if (!head) { return head; }
struct ListNode* cur = head; while (cur->next) { if (cur->val == cur->next->val) { cur->next = cur->next->next; } else { cur = cur->next; } }
return head; }
|
复杂度
时间复杂度:O(N),N是链表长度
空间复杂度:O(1)
扩展延伸
题目2
思路
算法的基本设计思想
用C语言描述单链表节点的数据类型定义
typedef struct node{ int data; struct node *link; }NODE; Typedef NODE *PNODE;
|
算法实现
void func (PNODE h, int n) { PNODE p=h, r; int *q, m; q= (int *)malloc(sizeof(int)*(n+1)); for(int i=0;i<n+1;i++) *(q+i) = 0; while(p->link != null) { m=p->link->data>0? p->link->data : -p->link->data; if(*(q+m) == 0) { *(q+m) = 1; p= p->link; } else { r= p->link; p->link = r->link; free(r); } } free(q); }
|
复杂度
时间复杂度:O(m)
空间复杂度:O(n)