ARTS 打卡week04
每周完成一个 ARTS: > Algorithm: 每周至少做一个 LeetCode 的算法题 > Review: 阅读并点评至少一篇英文技术文章 > Tips: 学习至少一个技术技巧 > Share: 分享一篇有观点和思考的技术文章
Algorithm
206. 反转链表
示例
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解析
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define true 1
#define false 0
typedef int ElementType;
typedef int bool;
typedef struct LNode *List;
typedef struct LNode *PLNode;
struct LNode {
ElementType Data;
PLNode Next;
};
List ReverseList( List L )
{
List newList = NULL;
List curNode = L;
List tmpNode = NULL;
while ( curNode != NULL )
{
List tmpNode = curNode;
curNode = curNode->Next;
tmpNode->Next = newList;
newList = tmpNode;
}
return newList;
}
24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例
给定 1->2->3->4, 你应该返回 2->1->4->3.
解析
swapNodes.go
package leetCode
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func SwapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
preNode, curNode := &ListNode{}, head
tmpNode := preNode
preNode.Next = head
for preNode.Next != nil && preNode.Next.Next != nil {
curNode = preNode.Next
preNode.Next = curNode.Next
curNode.Next = preNode.Next.Next
preNode.Next.Next = curNode
preNode = preNode.Next.Next
}
return tmpNode.Next
}
使用递归的方法求解
swapNodes.go
package leetCode
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func SwapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
newHead := head.Next
head.Next = swapPairs(newHead.Next)
newHead.Next = head
return newHead
}
swapNodes_test.go
package leetCode
import "testing"
func TestSwapPairs(t *testing.T) {
a := &ListNode{4, nil}
b := &ListNode{3, a}
c := &ListNode{2, b}
d := &ListNode{1, c}
newHead := SwapPairs(d)
for newHead != nil {
t.Logf("%d", newHead.Val)
newHead = newHead.Next
}
}