文章目录
- 两两交换链表中的节点
- 括号生成I
- 2009 408应用题42题
两两交换链表中的节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
//交换节点并递归
ListNode* swapPairs(ListNode* head) {
if(!head||!head->next)return head;//边界条件
//交换
ListNode* temp = head->next;
head->next=swapPairs(temp->next);
temp->next=head;
return temp;
}
};
head->next=swapPairs(temp->next);
这里需要注意一下递归出现的位置
括号生成I
class Solution {
public:
vector<string> result;
void helper(string str,int left,int right){
if(left)
helper(str+'(',left-1,right);
if(right>left)
helper(str+')',left,right-1);
if(!right)
result.push_back(str);
}
vector<string> generateParenthesis(int n) {
helper("",n,n);
return result;
}
};
2009 408应用题42题
已知一个带有表头结点的单链表,结点结构为:
假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。
要求:
(1)描述算法的基本设计思想。
(2)描述算法的详细实现步骤。
(3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C、C++或Java语言实现),关键之处请给出简要注释。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct node *next;
}node,*LinkList;
void ShowList(LinkList L){//输出链表内容
while(L){
printf("%d->",L->data);
L=L->next;
}
printf("NULL");
printf("\n");
}
LinkList CreateList_end(int n){
LinkList head = (LinkList)malloc(sizeof(node));
node *p,*e;
p=head;
int x;
for(int i=0;i<n;i++){
//尾插法建立链表
e=(LinkList)malloc(sizeof(node));
scanf("%d",&x);
e->data=x;
p->next=e;
p=e;
}
p->next=NULL;//将链表最后一个节点的指针域置空
head=head->next;
return head;
}
int LocateElement(LinkList list,int k){
LinkList p;
LinkList p1;
p1 = list->next;
p = list;
int i = 1;
while(p1){
p1 = p1->next;//快指针
i++;
if(i>k)
p=p->next;//如果i>k,则p也往后移
//慢指针
}
if(p==list)return 0;//p没有动,说明i<k,说明链表没有k个结点
else{
printf("%d\n",p->data);
return 1;
}
}