剑指offer-js编写-链表

(1)输入一个链表,从尾到头打印链表每个节点的值。

思路:用一个数组来接收打印的链表,链表的结构已经给出。

/*function ListNode(x){

this.val = x;

this.next = null;

}*/

function printListFromTailToHead(head)

{

var arr=[];

while(head){

arr.unshift(head.val);

head=head.next;

}

return arr;

}

(2)

输入一个链表,输出该链表中倒数第k个结点。

function FindKthToTail(head, k)

{

var arr=[];

while(head)

{

arr.push(head);

head=head.next;

}

if(arr.length==0 || k>arr.length){return false;}

return arr[arr.length-k];

}

(3)输入一个链表,反转链表后,输出链表的所有元素。

思路:新建一个头结点,遍历原链表,把每个节点用头结点插入到新建链表中。最后,新建的链表就是反转后的链表。

function ReverseList(pHead)

{

var pre = null;

var next = null;

while(pHead){

next = pHead.next;

pHead.next = pre;

pre = pHead;

pHead = next;

}

return pre;

}

(4)输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

function Merge(pHead1, pHead2)
{
     if (pHead1 == null || pHead2 == null) {
        return pHead1 || pHead2;
    }
      
    var head = null;
      
    if (pHead1.val < pHead2.val) {
        head = pHead1;
        head.next = Merge(pHead2,pHead1.next)
    }
    else {
        head = pHead2;
        head.next = Merge(pHead1, pHead2.next);
    }
    return head;
    
}

(5)输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。

递归思想:把大问题转化若干子问题

此题转化为一个头结点和除去头结点剩余部分,剩余部分操作和原问题一致

function RandomListNode(x){
    this.label = x;
    this.next = null;
    this.random = null;
}
function Clone(pHead)
{
    if(!pHead){
        return null;
    }
    var CloneHead=new RandomListNode(pHead.label);
    CloneHead.label=pHead.label;
    CloneHead.random=pHead.random;
     
    CloneHead.next=Clone(pHead.next);
    return CloneHead;
}

时间: 2024-10-05 04:45:23

剑指offer-js编写-链表的相关文章

【剑指offer】复杂链表的复制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数.(节点编号从1开始).接下来有n个数,表示链表节点中的值.接下来有n个数Ti,Ti表示第i个节点的另

剑指OFFER之反转链表(九度OJ1518)

题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素. 输出: 对应每个测试案例,以此输出链表反转后的元素,如没有元素则输出NULL. 样例输入: 5 1 2 3 4 5 0 样例输出: 5 4 3 2 1 NULL 解题思路:

剑指offer (27) 复杂链表的复制

题目:请实现一个函数,复制一个复杂链表,在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点,还有一个m_pSibling指向链表中的任意节点或者NULL struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; }; 方法一: step1. 复制原始链表的每一个节点,并用m_pNext链接起来 step2. 设置每个结点的m_pSibling指针 由于m

剑指Offer:删除链表的节点【18】

剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题目分析 如上图所示,我们的定义了三个指针,其中第二.三个指针用于找到重复元素的第一个位置和最后一个位置的下一个位置,然后第一个指针的下一个指向三个指针,这样就跳过了重复元素. 但是编码发现后,还有两种情况欠考虑. 这种情况,刚开始,就是

【Java】 剑指offer(35) 复杂链表的复制

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指向下一个点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr. 思路 思路1:先复制结点,用next链接,最后根据原始结点的sibling指针确定该sibling结点距离头结点的位

剑指offer 15:链表的倒数第k个节点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思路 使用快慢指针法,让快指针先走k步,然后再让慢指针开始走,当快指针到达链表尾部时,慢指针刚好到达倒数第k个节点. C++代码实现: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindKthToTail(ListN

《剑指offer》复杂链表的复制

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向

剑指offer编程-链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 1.遍历链表得到链表的长度l,找到从前往后的第l-k+1个节点.需要遍历两遍. 2.遍历一次即可的方法:两个指针,第一个指针从头向尾移动k-1步后第二个指针开始从头向尾移动,第一个指针到尾结点时第一个指针指向倒数第k个结点. ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead==NULL || k==0) return NULL; Li

剑指Offer - 两个链表第一个公共节点

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 输入两个链表,找出它们的第一个公共结点. 代码: 注意:没有检测环状链表. /* struct ListNode { int

《剑指offer》---输出链表倒数第k个结点

本文算法使用python3实现 1. 问题1 1.1 题目描述: ??输入一个链表,输出该链表中倒数第k个结点. ??时间限制:1s:空间限制:32768K 1.2 思路描述: ??方法一:当链表长度为 $ n $ 时,输出链表倒数第 $ k $ 个节点,即输出链表正数第 $ n-k $ 个节点.需先遍历链表计算链表长度,再从头至尾查找第 $ n-k $ 个节点,并输出. ??方法二:可以用两个指针同时指向链表头结点,第一个指针先遍历到第k个结点,此时第二个指针指向头结点,两个指针的距离为k-1