链表

[剑指offer]反转链表

别等时光非礼了梦想. 提交于 2020-03-04 07:31:41
题目描述 输入一个链表,反转链表后,输出新链表的表头。 解答 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode ReverseList ( ListNode head ) { if ( head == null ) return null ; ListNode pre = null ; ListNode next = null ; while ( head != null ) { next = head . next ; head . next = pre ; pre = head ; head = next ; } return pre ; } } 来源: CSDN 作者: 木头人i 链接: https://blog.csdn.net/weixin_43332735/article/details/104633576

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null(Java实现)

社会主义新天地 提交于 2020-03-04 06:44:45
public class LinkedList { //给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null //为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环 class ListNode { int val ; ListNode next ; ListNode ( int x ) { val = x ; } } public ListNode detectCycle ( ListNode head ) { if ( head == null ) { return null ; } ListNode fast = head ; ListNode slow = head ; while ( true ) { //如果 fast 遇到 null,说明链表无环,直接返回 null if ( fast == null || fast . next == null ) { return null ; } fast = fast . next . next ; slow = slow . next ; //如果 fast 遇见 slow ,则表示有环,跳出循环 if ( fast == slow ) { break ; } } //在链表开始再创建一个 cur, cur 和

UVa 11988 Broken Keyboard (a.k.a. Beiju Text)【链表】

孤人 提交于 2020-03-04 05:25:54
读了半天题,没看懂什么意思。 然后发现是这样的,home和end键按下去后会回到这一行的开始和结束。如果不知道这个可能不会读懂题目。(这俩键平时也没人用啊,在键盘的角落上,出个题也不解释一下) 下面说题: 数组复杂度太高,超时,用链表。 也就是说,一旦按下home键,之后的文字就接在头部,一旦按下end键,之后的文字就接在尾部,这样就简单了。 根据home和end来构建一个链表,用next数组表示,然后根据链表输出。 next [ i ] = next [ cur ] ; next [ cur ] = i ; if ( cur == last ) last = i ; cur = i ; 第一句用来保证更新链表终点 第二句用来更新下一个点 第三句及时更新尾指针 第四句更新当前位置 参照紫书代码: const int maxn = 100000 + 5 ; int last , cur , next [ maxn ] ; char s [ maxn ] ; int main ( ) { while ( scanf ( "%s" , s + 1 ) == 1 ) { int n = strlen ( s + 1 ) ; //保存在s[1],s[2]...中 last = cur = 0 ; next [ 0 ] = 0 ; //next[i]的意思是指第i位置的下一个位置 for (

LeetCode 21 链表 Merge Two Sorted Lists

放肆的年华 提交于 2020-03-04 00:21:20
LeetCode 21 链表 Merge Two Sorted Lists LeetCode Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. Example: Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4 代码: 递归 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1 == null) return l2; if(l2 == null) return l1; if(l1.val < l2.val){ l1.next = mergeTwoLists(l1.next, l2); return l1; }else{ l2.next = mergeTwoLists(l1, l2.next); return l2; } } } 迭代 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode

[算法]合并两个有序的单链表

一世执手 提交于 2020-03-03 22:54:41
题目: 给定两个有序单链表的头结点head1和head2.请合并两个有序链表,合并后的链表依然有序,并返回合并后的链表的头结点。 例如: 0->2->3->7->null; 1->3->5->7->9->null; 合并后的链表为:0->1->2->3->3->5->7->7->9->null。 程序: public static Node merge(Node head1,Node head2){ if (head1==null||head2==null) { return head1=head2==null?head2:head1; } Node head=head1.value<head2.value?head1:head2; Node cur1=head1.value<head2.value?head1:head2; Node cur2=head1.value>head2.value?head1:head2; Node pre=cur1; Node next=cur1.next; while(cur1!=null&&cur2!=null){ if (cur1.value<=cur2.value) { pre=cur1; cur1=cur1.next; }else{ next=cur2.next; pre.next=cur2; cur2.next=cur1; pre=cur2

java 双向循环链表

浪尽此生 提交于 2020-03-03 22:41:44
博客园第一篇正式文章,献上自己的原创代码,欢迎园友交流指教! java 之 双向循环链表 新鲜出炉 1 package com.xlst.util; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 import java.util.UUID; 6 7 /** 8 * 双向循环链表 9 * 完成时间:2012.9.28 10 * 版本1.0 11 * @author xlst 12 * 13 */ 14 public class BothwayLoopLinked { 15 /** 16 * 存放链表长度的 map 17 * 18 * 如果简单使用 static int 型的 size 基本类型变量,则只能维护一个双向循环链表。 19 * 同时存在两个及以上双向循环链表时,数据会错乱 20 */ 21 private static final Map<String, Integer> sizeMap = new HashMap<String, Integer>(); 22 /** 23 * 双向链表的 id 24 * 一个双向一个唯一的 id 25 * 根据这个id可以从 sizeMap 中取出当前链表的长度 26 */ 27 private String linkedId = null; 28 29 /** 30 *

剑指offer---反转链表

China☆狼群 提交于 2020-03-03 21:09:12
题目描述 :输入一个链表,反转链表后,输出新链表的表头。 思路 :定义两个指针,反向输出 package Function ; //迭代:两个指针,反向输出,时间复杂度:O(n),空间复杂度:O(1) import Test . ListNode ; public class reverseList24 { public ListNode reverseList ( ListNode head ) { ListNode pre = null ; ListNode curr = head ; while ( curr != null ) { ListNode tmp = curr . next ; curr . next = pre ; pre = curr ; curr = tmp ; } return pre ; } } 来源: CSDN 作者: LuckyAsYou 链接: https://blog.csdn.net/qq_36113761/article/details/104636918

数据结构---链表

一笑奈何 提交于 2020-03-03 20:57:54
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct Node 5 { 6 int data; //数据域 7 struct Node * pNext;//指针域 8 }NODE,*PNODE; 9 10 //函数声明 11 PNODE creat_list(void); 12 void traverse_list(PNODE pHead); 13 bool is_empty(PNODE pHead); 14 int length_list(PNODE pHead); 15 bool insert_list(PNODE ,int,int); 16 bool delete_list(PNODE,int,int *);// int*表示删除的数字 17 void sort_list(PNODE); 18 19 20 int main (void) 21 { 22 PNODE pHead = NULL; 23 int val; 24 25 pHead = creat_list();//创建一个非循环单链表 ,并将该链表的头结点的地址付给pHead; 26 traverse_list(pHead); 27 insert_list(pHead,4,33); 28 traverse_list(pHead); 29

LeetCode 链表相关题目

孤人 提交于 2020-03-03 17:27:06
1、445题, 题目描述 :给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 示例 : 输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 8 -> 0 -> 7 思路 : 1、两数相加,要考虑到进位; 2、由于此题高位在链表头部,低位在链表尾部。而进位要考虑从低位开始。所以需要从尾部开始相加。所以,使用 双栈法 ,从链表头部开始入栈,栈顶即为尾部的节点,进行相加操作。 代码 : import java . util . Stack ; public class T_445 { private class ListNode { int val ; ListNode next ; ListNode ( int x ) { val = x ; } } public ListNode addTwoNumbers ( ListNode l1 , ListNode l2 ) { // 定义两个栈 Stack < Integer > st1 = new Stack < Integer > ( ) ; Stack < Integer > st2 = new Stack < Integer > ( ) ; //

剑指offer 66题 -- 输入一个链表,输出该链表中倒数第k个结点。

和自甴很熟 提交于 2020-03-03 17:18:38
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {   //变量定义区   ListNode* pNode = pListHead;   ListNode* pPrevious = pListHead;   //入参检查   if(pListHead == NULL || k ==0)     return NULL;   //先移动k个节点   for(unsigned int i=0; i < k-1; i++)   {     if(pNode->next == NULL )       return NULL;        pNode = pNode->next;   }   //前后节点整体移动   while(pNode->next != NULL)   {     pNode = pNode->next;     pPrevious = pPrevious->next;   }   return pPrevious; } };