给定元素序列:{15,11,18,6,3,5,9},如果确定采用单链表存储数据,请你设计一个速度最快的算法,实现查找倒数第k个元素结点。要求: (1)描述算法的核心设计思想 (2)写出算法的C语言代码 (3)分析算法的时间复杂度
时间: 2024-02-13 09:04:40 浏览: 48
1. 算法核心设计思想
算法核心设计思想是采用双指针法,定义两个指针p和q,p指向链表头节点,q指向第k个节点,然后p和q同时向后移动,直到q指向链表尾节点,此时p指向的节点就是倒数第k个节点。
2. 算法C语言代码
```
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* findKthToTail(struct ListNode* head, int k){
struct ListNode *p = head, *q = head;
int i;
for (i = 0; i < k && q != NULL; i++) {
q = q->next;
}
if (i < k) {
return NULL;
}
while (q != NULL) {
q = q->next;
p = p->next;
}
return p;
}
```
3. 算法时间复杂度分析
算法的时间复杂度为O(n),其中n为单链表的长度。因为算法只需要遍历一次单链表,所以时间复杂度为线性的。
相关问题
请编写java程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
单链表是由一系列结点组成的,每个结点包含一个数据域和一个指针域。数据域用来存储元素的值,指针域用来指向下一个结点。下面是使用Java编写的单链表插入和删除结点的基本算法:
```java
// 定义单链表的结点类
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
// 定义单链表类
class LinkedList {
ListNode head;
// 在链表尾部插入结点
public void insert(int val) {
ListNode newNode = new ListNode(val);
if (head == null) {
head = newNode;
} else {
ListNode current = head;
while (current.next != null) {
current = current.next;
}
current.next = newNode;
}
}
// 删除指定值的结点
public void delete(int val) {
if (head == null) {
return;
}
if (head.val == val) {
head = head.next;
} else {
ListNode current = head;
while (current.next != null && current.next.val != val) {
current = current.next;
}
if (current.next != null) {
current.next = current.next.next;
}
}
}
// 输出链表的元素值
public void printList() {
ListNode current = head;
while (current ! null) {
System.out.print(current.val + " ");
current = current.next;
}
System.out.println();
}
}
// 测试
public class Main {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.insert(1);
list.insert(2);
list.insert(3);
list.printList();
list.delete(2);
list.printList();
}
}
```
以上是一个简单的单链表的插入和删除结点的示例程序。
6-1 递增的整数序列链表的插入 分数 15 作者 DS课程组 单位 浙江大学 本题要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。 函数接口定义: List Insert( List L, ElementType X ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Insert要将X插入L,并保持该序列的有序性,返回插入后的链表头指针。
这道题目的思路相对比较简单,只需要遍历链表,找到第一个大于等于插入元素的元素位置,然后在该位置前插入新元素即可。以下是具体的实现过程:
```c++
List Insert(List L, ElementType X) {
PtrToNode pre = L, cur = L->Next; // 遍历链表
while (cur && cur->Data < X) { // 找到第一个大于等于X的元素位置
pre = cur;
cur = cur->Next;
}
PtrToNode newNode = (PtrToNode)malloc(sizeof(struct Node)); // 创建新结点
newNode->Data = X;
newNode->Next = cur;
pre->Next = newNode; // 在该位置前插入新元素
return L;
}
```
阅读全文